我正在尝试创建一个简单的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;
}
答案 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。