プロが教える店舗&オフィスのセキュリティ対策術

VCで作成したDLLの使用

VC6.0で作成されたDLLファイルを使いたいのですが
_stdcallで記述されたものではなく
DllMainで記述されたものなのですが、
VBから呼び出す事は可能でしょうか?

普通にdeclare functionで呼び出そうとすると、
「エントリfnchogeがDLLファイル hoge.dll内に関数が見つかりません。」
とエラーがでるだけでした。

VB6.0SP3
Windows2000

A 回答 (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()は不要であれば作成する必要はありません。
個人的には、インスタンスハンドルを保存するのに作るときのほうが多いですが。
    • good
    • 0
この回答へのお礼

再びのご回答有り難うございます。
大変勉強になりました。

お礼日時:2002/08/13 23:38

>_stdcallで記述されたものではなく


>DllMainで記述されたものなのですが、

_stdcallとDllMain、まったく関係ないのですが・・・

両者の意味わかってますか?

_stdcallは、呼び出し規約(パラメータのスタックへのつみ方)で、
DllMain()はエントリポイントの関数名です。


CのDLLの関数をVBから呼べるようにするためには
1._stdcallで宣言する
2.__declspec(dllexport)をつけるか、DEFファイルを使用して関数をexportする

必要があります。

つまり、1、2の両方が満たされない関数はVBから呼ぶ方法はありません。
    • good
    • 0
この回答へのお礼

DEFファイルで定義しstdcallする事で解決しました。
ありがとうございました。
元々は
#define EXPORTS __declspec(dllexport)
でEXPORTS BOOL fnchoge(void)という形でしたが
これだとVBからdeclare fanctionで呼び出す事ができなかったのですが
どういった原因があるのでしょうか。

またご指摘の通りDLLMainについてよくわかっていません。
DLLMainですがVBから呼び出した場合も
エントリポイントとして意味があるのでしょうか?
今まではDLL作成の際、
DLLMainを作らずDLLを作成してたいのですが。

お礼日時:2002/08/13 13:22

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!