【发布时间】:2020-10-13 12:48:19
【问题描述】:
像往常一样,经过几个小时的研究和尝试,我在这里发帖,但没有成功
我有这个用C编写的旧dll。目前它没有接口,但我需要为其添加一个对话框。
我使用 VS2017 并尝试了以下方法:
使用VS2017资源编辑器,我添加了一个对话框(id:IDD_DIALOG_REPLAY,资源编辑器在resource.h文件中自动定义为101)并添加以下代码来创建我的对话框:
INITCOMMONCONTROLSEX InitCtrls;
InitCtrls.dwSize = sizeof(InitCtrls);
InitCtrls.dwICC = ICC_LINK_CLASS | ICC_STANDARD_CLASSES | ICC_WIN95_CLASSES;
InitCommonControlsEx(&InitCtrls);
HWND hDialog = 0;
hDialog = CreateDialog(pSGL->hInstance,MAKEINTRESOURCE(IDD_DIALOG_REPLAY),NULL,WndProc);
if (!hDialog)
{
char buf [100];
wsprintf (buf, "Error x%x", GetLastError ());
MessageBox (0, buf, "CreateDialog", MB_ICONEXCLAMATION | MB_OK);
return 1;
}
ShowWindow(hDialog, SW_SHOW);
注意 1:消息循环已经存在于同一线程中执行的另一个 dll 中
注意 2:我第一次使用了一个非常标准的回调函数 WndProc,它基本上执行 DefWindowProc 函数
当我编译我的 dll(设置了 ressource 编译详细选项)时,我收到以下消息:
1>Writing DIALOG:101, lang:0x40c, size 452.
1>Writing AFX_DIALOG_LAYOUT:101, lang:0x40c, size 2.
当我在VS2017中打开我的dll的二进制文件时,我可以看到有一个对话框id 101
=> 对话框实际上存在于我的二进制文件中。
但是当我执行它时,我得到一个错误 0x715 : ERROR_RESOURCE_TYPE_NOT_FOUND,当然,对话框没有被创建。
注意:无论对话框是否包含控件或为空,都会发生这种情况
我完全不知道为什么会这样。非常欢迎任何帮助。
提前致谢,
安东尼
【问题讨论】:
-
您没有正确初始化
INITCOMMONCONTROLSEX结构,因此如果您的对话框实际使用任何公共控件,它的创建可能会因此而失败。 -
我改变了这个(我希望是正确的)但这并没有解决我的问题。再一次,即使我的对话框是空的,我也遇到了问题。
-
pSGL->hInstance的值有误。 -
pSGL->hInstance 包含主 exe hInstance。但以防万一,我将其替换为 GetModuleHandle(NULL) => 仍然是相同的错误 0x715....... 在任何情况下,调用 CreateDialog 将 hInstance 设置为 NULL 不应阻止创建窗口
-
设置为NULL也一样,都是在.exe文件而不是.dll文件中查找资源。
标签: winapi visual-c++ visual-studio-2017 embedded-resource