2013-10-08 50 views
-2

我正在尝试创建一个简单的dll,其中包含一个简单的对话框和列表框.rc文件。我通过visual studio的帮助创建了资源,并使用拖放控件。我已经暴露了一个实习生请求的函数DialogBox() API。Win32 GUI:未能创建win32 GUI对话框

我从样本Windows应用程序动态加载DLL并调用暴露的函数。对话框创建失败,错误代码为126

任何人都可以帮助我为什么它的行为如此!

下面是代码:

INT_PTR CALLBACK WndProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) 
{ 
    switch(uMsg) 
    { 

    case WM_INITDIALOG: 
     { 
       InitCommonControls(); 
       PopulateList(hwndDlg); 
       return TRUE; 
     } 
    case WM_COMMAND: 
     { 
      switch(wParam) 
      { 
      case IDOK: 
       SaveSelectedItem(hwndDlg); 
       EndDialog(hwndDlg,0);  
       return TRUE; 
     case IDCANCEL: 
       EndDialog(hwndDlg, 0); 
       return TRUE; 

      } 

     } 
    default: 
     DefWindowProc(hwndDlg, uMsg, wParam, lParam); 

    } 
} 
HINSTANCE gInstance; 

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, 
       LPSTR lpCmdLine, int nCmdShow) 
{ 
DialogBox(gInstance, MAKEINTRESOURCE(IDD_DIALOG), hwnd, WndProc); 

return TRUE; 
} 
+0

你的程序调用'InitCommonControlsEx()'吗? –

+1

你可以显示一行或两行代码吗? –

+0

你的代码在哪里?我看不到任何代码。 –

回答

0

你从来没有分配给gInstance,所以它是默认初始化为NULL。然后你将它传递给DialogBox

hInstance分配到gInstanceWinMain

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, 
       LPSTR lpCmdLine, int nCmdShow) 
{ 
    gInstance = hInstance; 
    DialogBox(gInstance, MAKEINTRESOURCE(IDD_DIALOG), hwnd, WndProc); 
    return TRUE; 
} 

或者只是废除gInstance完全因为你不使用它,其他任何地方。删除变量,让你WinMain这样的:

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, 
       LPSTR lpCmdLine, int nCmdShow) 
{ 
    DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG), hwnd, WndProc); 
    return TRUE; 
} 

还有就是你会忽略,但因为我看不到的hwnd声明或初始化更多的代码。如果可能的话,最好展示一个完整的SSCCE,这显然是可能的。

同时也要注意雷蒙德对这个问题的评论,并将调用InitCommonControls移到WinMain中。