- ベストアンサー
VCで作成したDLLの使用
VCで作成したDLLの使用 VC6.0で作成されたDLLファイルを使いたいのですが _stdcallで記述されたものではなく DllMainで記述されたものなのですが、 VBから呼び出す事は可能でしょうか? 普通にdeclare functionで呼び出そうとすると、 「エントリfnchogeがDLLファイル hoge.dll内に関数が見つかりません。」 とエラーがでるだけでした。 VB6.0SP3 Windows2000
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
>#define EXPORTS __declspec(dllexport) >でEXPORTS BOOL fnchoge(void)という形でしたが まず、_stdcallがないですね。_stdcallがないと、落ちるだけだと思うので、エラーとは関係ないですけど。 エラーの原因として考えられるのは、 __declspec(dllexport)を使うと、関数名が引数のバイト数で修飾されて、VBで呼び出すときの関数名が変わってしまうときがあるためだと思われます。 なお、実際にどんな名前でEXPORTされているかはDUMPBINや Dependency Walker(どちらもVC++に付属)で調べることができます。 >DLLMainですがVBから呼び出した場合も >エントリポイントとして意味があるのでしょうか? DLLにおけるエントリポイントは、最初にVBからDLLがロードされたときに、一番最初にコールされる関数です。 普通のCのプログラムで考えると、LoadLiblary()で呼び出されたのと同じ状態です。 で、DllMain()は不要であれば作成する必要はありません。 個人的には、インスタンスハンドルを保存するのに作るときのほうが多いですが。
その他の回答 (1)
- taka_tetsu
- ベストアンサー率65% (1020/1553)
>_stdcallで記述されたものではなく >DllMainで記述されたものなのですが、 _stdcallとDllMain、まったく関係ないのですが・・・ 両者の意味わかってますか? _stdcallは、呼び出し規約(パラメータのスタックへのつみ方)で、 DllMain()はエントリポイントの関数名です。 CのDLLの関数をVBから呼べるようにするためには 1._stdcallで宣言する 2.__declspec(dllexport)をつけるか、DEFファイルを使用して関数をexportする 必要があります。 つまり、1、2の両方が満たされない関数はVBから呼ぶ方法はありません。
お礼
DEFファイルで定義しstdcallする事で解決しました。 ありがとうございました。 元々は #define EXPORTS __declspec(dllexport) でEXPORTS BOOL fnchoge(void)という形でしたが これだとVBからdeclare fanctionで呼び出す事ができなかったのですが どういった原因があるのでしょうか。 またご指摘の通りDLLMainについてよくわかっていません。 DLLMainですがVBから呼び出した場合も エントリポイントとして意味があるのでしょうか? 今まではDLL作成の際、 DLLMainを作らずDLLを作成してたいのですが。
お礼
再びのご回答有り難うございます。 大変勉強になりました。