16ビットアプリから32ビットDLLの使用

[戻る]
asia 2004/07/13(火) 10:02:03
質問させていただきます。

32ビットDLL(ソースはありません)を16ビットアプリ(ソースあり)から呼び出し、
使用する為の方法は何があるのでしょうか?

エクスポートされている関数名はわかっている状態です。

よろしくお願いします。

アイススケーター 2004/07/13(火) 11:02:21
多分無理だと思うし、まずリンクするために必要なLIBファイルはあるの?

たく [E-Mail] 2004/07/13(火) 11:04:44
「thunk 16 32」でぐぐると出てきます。

asia 2004/07/13(火) 11:22:02
DLLのヘッダーとlibはある状態です。

サンクはDLLのソースがなくてもできるのでしょうか?

たく [E-Mail] 2004/07/13(火) 11:44:03
調べてみましたか?

ところで、ソースがあるのなら32ビットでビルドすればよいのでは?

asia 2004/07/13(火) 11:50:33
16ビットアプリと32ビットアプリを分けているのには
理由があり、中身は微妙に異なっています。
分けている、理由はお伝えできませんが、、、

asia 2004/07/13(火) 12:07:34
32ビットDLLの中でスレッドを生成している処理があるようで、
その場合、サンクを使用すると16ビットアプリからのAPI実行時に
API処理内のスレッド生成が失敗するという情報をみつけました。

サンクは無理なようです。

<情報ソース>
ttp://www.webcom-corp.co.jp/old/Win32FAQ/faq/q00099.htm

これは、もう手詰まりっぽいです・・・

asia 2004/07/13(火) 17:15:10
[[解決]]
自己解決したので、一応報告です。


16ビットアプリで32ビットDLLを使いたい場合の手順は次の通りです。

まず、使用したい32ビットAPIの関数ポインタを定義する。
次に、LoadLibrary("KRNL386.EXE")でkrnl386.exeをロードします。
ロードに失敗した場合は、FreeLibrary(KRNL386のインスタンス)が必要です。

ロードできた場合、GetProcAddressを使用して目的のAPIアドレスを
取得し、受け取り変数に32ビットAPI用の関数ポインタを指定します。

GetProcAddressで必ず取得する必要があるのが、
32ビット用のLoadLibraryEx32()と、GetProcAddress32()、
_CallProcEx32()、FreeLibrary32()です。

後の手順は通常と同じで、

LoadLibraryEx32の関数ポインタを使用して32ビットDLLをロード
↓
GetProcAddress32でAPIアドレス取得
↓
CallProcEx32で呼び出し
↓
FreeLibrary32で開放

です。

その後の後片付けで、FreeLibrary(KRNL386のインスタンス)を
行ないます。


サンクコンパイラにばかり目が行って、
95/98用のデバイスドライバを読み込む機能を持つ
KRNL386.EXEの本来の役目を見逃してました(>_<)

古いスレッドには追加発言できません。