16ビットアプリから32ビットDLLの使用 – プログラミング – Home

16ビットアプリから32ビットDLLの...
 
通知
すべてクリア

[解決済] 16ビットアプリから32ビットDLLの使用


asia
 asia
(@asia)
ゲスト
結合: 21年前
投稿: 6
Topic starter  

質問させていただきます。

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

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

よろしくお願いします。


引用未解決
トピックタグ
アイススケーター
 アイススケーター
(@アイススケーター)
ゲスト
結合: 23年前
投稿: 280
 

多分無理だと思うし、まずリンクするために必要なLIBファイルはあるの?


返信引用
たく
 たく
(@たく)
ゲスト
結合: 21年前
投稿: 29
 

「thunk 16 32」でぐぐると出てきます。


返信引用
asia
 asia
(@asia)
ゲスト
結合: 21年前
投稿: 6
Topic starter  

DLLのヘッダーとlibはある状態です。

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


返信引用
たく
 たく
(@たく)
ゲスト
結合: 21年前
投稿: 29
 

調べてみましたか?

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


返信引用
asia
 asia
(@asia)
ゲスト
結合: 21年前
投稿: 6
Topic starter  

16ビットアプリと32ビットアプリを分けているのには
理由があり、中身は微妙に異なっています。
分けている、理由はお伝えできませんが、、、


返信引用
asia
 asia
(@asia)
ゲスト
結合: 21年前
投稿: 6
Topic starter  

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

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

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

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


返信引用
asia
 asia
(@asia)
ゲスト
結合: 21年前
投稿: 6
Topic starter  

自己解決したので、一応報告です。

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の本来の役目を見逃してました(>_<)


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました