2009-07-21 53 views
3

我想要一個帶有窗口創建和管理代碼的DLL,開發人員只需添加一個名爲main.h的頭並加載DLL即可實例化一個窗口。將Windows消息循環封裝到一個DLL中

#include "dllheader.h" 

void user_main(); 

main = user_main; // attach user main to the dll callback 

int user_main() { 
    Window *w = new Window(); 
} 

的DLL端的代碼看起來應該像

void (*main)() = NULL; 

int WinMain(...) { 
    if(main) 
     main(); // call the user defined funcion 
    while(!done) { 
     if(messageWaiting()) { 
      processMessage(); 
     } 
    } 

} 

爲什麼?因爲我想部署一個窗口包裝並避免讓用戶寫入WinMain入口點。但是一個DLL項目有一個DLL主體和一個win32項目,如果鏈接程序沒有找到winMain入口點,就會使用DLL抱怨。

是否有這種安排的解決方案?

回答

3

每個Win32應用程序都必須有一個入口點(通常是WinMain)。所以你不能把入口放入DLL中,因爲它不是EXE的一部分。但是入口點可以在靜態鏈接的庫中。當靜態庫被鏈接時,入口點成爲EXE的一部分。

但我的建議是避免所有這些複雜性。只需使DLL的用戶調用如下所示:

int WinMain(HINSTANCE hInstance, HINSTANCE hPrev, LPSTR lpCmdLine, int nCmdShow) 
{ 
    return WrapperDllMain(hInstance, hPrev, lpCmdLine, nCmdShow, &user_main); 
} 

代碼很簡單,易於編寫。 DLL用戶沒有多少努力。您可以完全控制消息循環(以及整個流程生命週期)。

+0

沒什麼好說的,完美的。謝謝。 – 2009-07-21 01:07:12

1

您不能在獨立的DLL內實現應用程序的WinMain()入口點。應用程序必須實現其自己的入口點,否則鏈接器會發出抱怨,就像您已經發現的那樣。應用程序的入口點可以調用DLL中的函數,即:

--- app --- 

#include "dllheader.h" 

int user_main() 
{ 
    ... 
} 

int WinMain(...) 
{ 
    return dll_main(&user_main); 
} 


--- dll --- 

int dll_main(void (*user_main)()) 
{ 
    if(user_main) 
    user_main(); // call the user defined funcion 

    while(!done) 
    { 
    if(messageWaiting()) 
    { 
     processMessage(); 
    } 
    } 
    return 0; 
}