Win32 GUI:无法创建win32 GUI对话框

时间:2013-10-08 19:03:35

标签: c++ windows winapi user-interface win32gui

我正在尝试创建一个简单的dll,其中包含一个带有简单对话框和列表框的.rc文件。我已经在visual studio的帮助下创建了资源,并使用拖放控件。我已经公开了一个实习生调用 DialogBox() API。

我正在从示例窗口应用程序动态加载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;
}

1 个答案:

答案 0 :(得分:0)

您永远不会分配到gInstance,因此默认初始化为NULL。然后,您将其传递给DialogBox

hInstance分配到gInstance中的WinMain

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,这显然是可能的。

并注意到Raymond对该问题的评论,并将对InitCommonControls的调用转移到WinMain。