【发布时间】:2023-03-05 09:55:02
【问题描述】:
我想创建一个.dll,它会显示一些对话框。
在我的 .dll 中有这段代码:
HWND hDlg = CreateDialogParam(NULL, MAKEINTRESOURCE(IDD_RANKING_DIALOG), NULL, msgProc, NULL);
if (!hDlg) {
ShowError(GetLastErrorAsString().c_str());
return false;
}
ShowError 调用消息框,GetLastErrorAsString() 只调用标准GetLastError 并转换为字符串。
我有这个输出:
在图片文件中找不到指定的资源类型。
然后我有一个标准的 win32 Window 应用程序,在那里我调用方法,它调用提到的代码。
DialogTest test;
test.showDialog(); // calls functionality from .dll
我做错了什么?我需要将资源文件链接到 .dll 吗?
我正在使用 Visual Studio 2010,并且在我的资源文件 (.rc) 中指定了 dialog。
【问题讨论】:
-
您正在将
NULL中的hInstance参数传递给CreateDialogParam()。这意味着对话框资源将在加载了您的 DLL 的可执行文件中查找,而不是在 DLL 本身中查找。您应该传递与您的 DLL 关联的HINSTANCE。 -
我尝试过使用 GetModuleHandle(0) 而不是 NULL,但它没有帮助。那么如何获取dll的HINSTANCE。
-
它作为第一个参数传递给您的
DllMain()。 -
好的,如果我没有 DLLMain()?因为我的 .dll 是从 Java 代码调用的。他们在 java 中使用 System.LoadLibrary()。这是否会导致运行我的 DllMain() 然后我可以将 hInstance 保存到全局变量并用它创建对话框?
-
与资源错误无关,
ShowError(GetLastErrorAsString().c_str());是一个等待发生的错误。我假设GetLastErrorAsString返回std::wstring或std::string。这是暂时的,一旦c_str()返回,它就会超出范围。然后你将一个悬空指针传递给ShowError。