人生のプチ美学を教えてください!!

DLLを作っています。

BCC32では
 DllEntryPoint
が正常に呼び出されます。

しかし
cl.exeでコンパイルすると、呼び出されません。

解決方法はありますか。


環境は
Windows8.1タブレット
Visual Studio 2008
Borland C++ フリー
です。

A 回答 (2件)

>cl dll.c /LD



リンク間違えている…というワケではないみたいですね。

https://msdn.microsoft.com/ja-jp/library/cc42909 …
より、
>DllMain は、ライブラリ定義の関数名です。以前のバージョンの SDK のドキュメントは、エントリポイント関数名を DllEntryPoint と記述していました。開発者が独自の DLL を構築する場合は、実際に使う名前を指定しなければなりません。詳細については、開発ツールのドキュメントを参照してください。

ということで、VC系ではDllEntryPoint()ではなくDllMain()である必要があるようです。
リンクされるスタートアップ処理からコールされるのがVCだとDllMain()だけでDllEntryPoint()はコールしてくれないのでしょう。
Borland C++は少々古いはずなので、DllEntryPoint()でコールするようにライブラリが作られている…。ってところでしょうかね。

https://msdn.microsoft.com/ja-jp/library/f9t8842 …
でリンカにエントリポイントの関数名を指定するか…
DllEntryPoint()をコールするだけのDllMain()を追加するか…でしょうかね。
    • good
    • 2

>cl.exeでコンパイルすると、呼び出されません。



オプション指定はどんな感じなんでしょうか?
https://msdn.microsoft.com/ja-jp/library/19z1t1w …
    • good
    • 0
この回答へのお礼

返答ありがとうございます

コンパイル方法:
cl dll.c /LD
cl main.CPP

<dll.c>の抜粋:
#define EXPORT __declspec(dllexport)

EXPORT int TestFunc( int a, int b ) {
return( a + b );
}

BOOL DllEntryPoint(HINSTANCE hInstance, DWORD fdwReason, LPVOID *lpvReserved){
{
switch (fdwReason){
case DLL_PROCESS_ATTACH:
Beep( 440, 200 ); // ド
printf("DLL_PROCESS_ATTACH\n");
break;
case DLL_PROCESS_DETACH:
Beep( 440, 200 ); // ド
printf("DLL_PROCESS_DETACH\n");
break;
case DLL_THREAD_ATTACH:
Beep( 440, 200 ); // ド
printf("DLL_THREAD_ATTACH\n");
break;
case DLL_THREAD_DETACH:
Beep( 440, 200 ); // ド
printf("DLL_THREAD_DETACH\n");
break;
}
return TRUE;
}
}

お礼日時:2016/05/13 02:03

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


おすすめ情報