3

exeプロジェクトで:

int WINAPI WinMain( __in HINSTANCE hInstance, __in_opt HINSTANCE hPrevInstance, __in_opt LPSTR lpCmdLine, __in int nShowCmd )
{
    g_hMainWnd=CreateDialog(hInstance,MAKEINTRESOURCE(IDD_DIALOG1),NULL,(DLGPROC)DialogProc);
    RECT rcWnd;
    GetWindowRect(g_hMainWnd,&rcWnd);
    int X=(GetSystemMetrics(SM_CXSCREEN)-rcWnd.right+rcWnd.left)>>1,
        Y=(GetSystemMetrics(SM_CYSCREEN)-rcWnd.bottom+rcWnd.top)>>1;
    MoveWindow(g_hMainWnd,X,Y,rcWnd.right-rcWnd.left,rcWnd.bottom-rcWnd.top,FALSE);
    ShowWindow(g_hMainWnd,SW_SHOW);

    BOOL bRet;
    MSG msg;
    while( (bRet = GetMessage( &msg, NULL, 0, 0 )) != 0)
    { 
        if (bRet == -1)
        {
            MessageBox(NULL,_T("GetMessage error with -1 returned!"),_T("error"),MB_ICONHAND);
            break;
        }
        else if (!IsWindow(g_hMainWnd) || !IsDialogMessage(g_hMainWnd, &msg)) 
        {
            TranslateMessage(&msg); 
            DispatchMessage(&msg); 
        }
    }
    return 0;
}

最初にdllを出力するようにプロジェクト設定を変更しました。次に、WinMain を次のように変更しました。

BOOL APIENTRY DllMain( __in HINSTANCE hInstance, __in_opt HINSTANCE hPrevInstance, __in_opt LPSTR lpCmdLine, __in int nShowCmd )
{

    g_hMainWnd=CreateDialog(hInstance,MAKEINTRESOURCE(IDD_DIALOG1),NULL,(DLGPROC)DialogProc);
    HWND hMainWnd;
   //DialogProc involves the critical initialization of the data required for the export function used later


    return 0;
}

それで、もしそれがばかげた考えなら、それとも私は何かを見逃したのでしょうか? 皆さん、ありがとうございました!

4

2 に答える 2

0

DllMain の定義はオペレーティング システムによって使用され、場合によってはコードを入力する必要があります。EXE を実装するコードを実行するには、必要なパラメーターを受け取るパブリック ルーチンを作成する必要があります。

Visual Studio を使用して 1 つのライブラリ プロジェクトを作成し、一部のデータと関数をエクスポートします。
新しいプロジェクト-> Viasual c++ を選択- > Win32 を選択-> Win32 プロジェクト->プロジェクトに名前を付ける->次へ-> DLL を選択->エクスポート シンボルを選択->終了

最終的なプロジェクトには、エクスポートされる変数とパブリック ルーチンが含まれます。コードのテンプレートとして使用します。

于 2014-01-26T23:19:37.510 に答える
0
   BOOL WINAPI DllMain(
    HINSTANCE hinstDLL,  // handle to DLL module
    DWORD fdwReason,     // reason for calling function
    LPVOID lpReserved )  // reserved
{
    // Perform actions based on the reason for calling.
    switch( fdwReason ) 
    { 
        case DLL_PROCESS_ATTACH:
         // Initialize once for each new process.
         // Return FALSE to fail DLL load.
            break;

        case DLL_THREAD_ATTACH:
         // Do thread-specific initialization.
            break;

        case DLL_THREAD_DETACH:
         // Do thread-specific cleanup.
            break;

        case DLL_PROCESS_DETACH:
         // Perform any necessary cleanup.
            break;
    }
    return TRUE;  // Successful DLL_PROCESS_ATTACH.
}

詳細情報: Dll エントリ ポイント

于 2014-01-26T22:21:44.743 に答える