質問させていただきます。
32ビットDLL(ソースはありません)を16ビットアプリ(ソースあり)から呼び出し、
使用する為の方法は何があるのでしょうか?
エクスポートされている関数名はわかっている状態です。
よろしくお願いします。
多分無理だと思うし、まずリンクするために必要なLIBファイルはあるの?
「thunk 16 32」でぐぐると出てきます。
DLLのヘッダーとlibはある状態です。
サンクはDLLのソースがなくてもできるのでしょうか?
調べてみましたか?
ところで、ソースがあるのなら32ビットでビルドすればよいのでは?
16ビットアプリと32ビットアプリを分けているのには
理由があり、中身は微妙に異なっています。
分けている、理由はお伝えできませんが、、、
32ビットDLLの中でスレッドを生成している処理があるようで、
その場合、サンクを使用すると16ビットアプリからのAPI実行時に
API処理内のスレッド生成が失敗するという情報をみつけました。
サンクは無理なようです。
<情報ソース>
ttp://www.webcom-corp.co.jp/old/Win32FAQ/faq/q00099.htm
これは、もう手詰まりっぽいです・・・
自己解決したので、一応報告です。
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の本来の役目を見逃してました(>_<)