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 创建一个库项目来导出一些数据和函数。
新建项目->选择 V​​iasual 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 回答