【问题标题】:WinAPI CreateDialog Ressource not found error 0x715WinAPI 创建对话框资源未找到错误 0x715
【发布时间】: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


【解决方案1】:

好的,感谢Hans,我找到了原因。 我使用的是 exe hInstance,所以程序在 exe 中而不是 dll 中寻找对话框。

将 hInstance 更改为 dll 解决了我的问题。

再次感谢汉斯

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-17
  • 1970-01-01
  • 2017-07-02
  • 2011-06-30
  • 2016-03-31
  • 1970-01-01
相关资源
最近更新 更多