【发布时间】:2019-08-27 17:09:48
【问题描述】:
我遇到了一个奇怪的问题。相同的代码在 dll 之外可以完美运行,但在 dll 内部却无法运行。
dll 中的代码。错误和空值:
// 1813 here
HRSRC hrsrc = FindResourceW(hInstance,
MAKEINTRESOURCE(IDD_DIALOG1),
RT_DIALOG);
// NULL here.
HGLOBAL hg = LoadResource(hInstance, hrsrc);
在 dll 之外,一切正常:
// Pointer here, all fine
HRSRC hrsrc = FindResourceW(hInstance,
MAKEINTRESOURCE(IDD_DIALOG1),
RT_DIALOG);
// Pointer here.
HGLOBAL hg = LoadResource(hInstance, hrsrc);
该资源确实存在于 dll 资源中,我检查甚至重新创建了我的资源文件。它在这两种情况下都可以编译,没有Symbol not resolved 错误。
是的,我将 hInstance 参数传递给 dll 函数。 double* arr = ShowXMinXMaxDialogDisableParent(hInst, hWnd, xMin, xMax); 它不为空(至少在调试时)。我在 WinMain 函数中初始化了hInstance,所以它是正确的:
// main function
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
hInst = hInstance;
我不知道出了什么问题。 hInstance 错了?很明显,我用调试器检查了它。没有变化,值完全一样。
解决方案:
需要使用 DLL 实例,而不是应用程序实例。我可以在DllMain dll 函数中得到它。
【问题讨论】:
-
估计是实例句柄错误
-
它在这两种情况下都可以编译 -- 这没有任何意义,只是你的代码中没有语法错误。
-
由于 DLL 是一个单独的可执行文件(即使它是一个“库”),它有自己的 hinstance 句柄,与应用程序分开。您检索到 DLL 实例句柄了吗?
-
好吧,伙计们,你们都是对的。它不是 dll 实例句柄,而是应用程序实例句柄。我的问题是,我认为有平等的)))
标签: c++ winapi dll loadlibrary