1

多くのコードを何度も何度も入力するのを避けるために、WinMain 関数を DLL 内に隠そうとしています。

wWinMain を次のように宣言して DLL からエクスポートしました。

extern "C" int WINAPI wWinMain( ... ) { // repetitive code here }

リンカーオプション/EXPORT:wWinMainを使用しましたが、別のプロジェクトでインポートライブラリを使用しようとするとエラーが発生します

LIBCMTD.lib(wincrt0.obj) : error LNK2019: unresolved external symbol _WinMain@16 referenced in function __tmainCRTStartup

備考GUI インターフェイスを使用したいのですが、WinMain 関数ではなくメイン関数を定義するときによくあるエラーです。また、両方のプロジェクトで UNICODE サポートを有効にしました。私は何をすべきか?

4

6 に答える 6

2

これはそのままでは不可能です。リンカーは、EXE のエントリポイントを EXE 内の関数にしか設定できません。DLL 内の wWinMain() の名前を別の名前に変更します。EXE にリンクされるソース コード ファイルに wWinMain() を記述し、単に DLL のエクスポートされた関数を呼び出します。

于 2010-12-29T06:22:19.600 に答える
0

WinMain を DLL 内に配置する 1 つの方法を見つけました。

  • wWinMain の代わりに WinMain を使用する必要があります (理由はわかりません)。
  • プロジェクトに def ファイルを
    追加し、def ファイルにEXPORTS WinMainを追加します。このような

    輸出

    WinMain

    観察から、WinMain だけでなく、すべてのエクスポート関数を生成する必要があります。

    テスト後、__declspec(dllexport)のやり方がWinMainに無効。

  • #pragma comment(lib, "testDll.lib") を 使用するか、プロジェクトの設定を変更して、プログラムを DLL ライブラリにリンクします。
于 2012-12-19T13:41:20.593 に答える
0

dll の WinMain を呼び出したい場合は、CRTWinMainStartup 関数 (好きな CRT ライブラリの _tmainCRTStartup) を置き換え、エクスポートされた WinMain を呼び出すようにする必要があります。プログラム (CRT スタートアップのソースは、任意のコンパイラの crt ソースにある必要があります)

于 2010-12-29T07:23:20.657 に答える
0
EXPORT int WINAPI _WinMain_(int (*_main_)(int argc, char **argv), HINSTANCE hInst, HINSTANCE    hPrevInstance, LPSTR commandLine, int nCmdShow);
int _XMain( int argc, char **argv );

#define XMain   WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInstance, LPSTR commandLine, int nCmdShow)\
{return _WinMain_( _XMain, hInst, hPrevInstance, commandLine, nCmdShow );}  \
int _XMain

次に、_WinMain_()コールまたはスケジュールし_XMain()ます。

アプリケーション ソースで次のようにします。

int XMain( int argc, char **argv )
{
}
于 2014-10-01T19:27:34.980 に答える
0

DLL で WinMain を使用する必要がありますか? DllMain ではないでしょうか。

于 2010-12-29T04:31:35.737 に答える