【发布时间】:2011-12-03 08:42:27
【问题描述】:
好的,所以我有一种情况,我在我编写的 DLL 上调用 LoadLibrary。此对 LoadLibrary 的调用返回错误 #998,或 ERROR_NOACCESS“对内存位置的无效访问。”
有问题的 DLL 在一种配置中使用 MFC,而不是在另一种配置中;只有 MFC 配置有这个问题。它以前可以工作,但我不知道我改变了什么:我实际上已经转向非 MFC 版本,并且一直在修改它,我不知道我能拥有什么这样做会影响 MFC 版本。
我对 DLL 了解不多。原来的加载代码其实是给我的,我也没改。以下是该代码:
// submodule loading
#ifndef MFC
// Project uses standard windows libraries, define an entry point for the DLL to handle loading/unloading
BOOL WINAPI DllMain(HANDLE hDllHandle, DWORD dwReason, LPVOID lpreserved)
{
_MESSAGE("DllMain called.");
switch(dwReason)
{
case DLL_PROCESS_ATTACH: // dll loaded
hModule = (HMODULE)hDllHandle; // store module handle
_MESSAGE("Attaching Submodule ...");
break;
case DLL_PROCESS_DETACH: // dll unloaded
_MESSAGE("Detaching Submodule ...");
break;
}
return true;
}
#else
// Project uses MFC, we define here an instance of CWinApp to make this a 'well-formed' DLL
class CSubmoduleApp : public CWinApp
{
public:
virtual BOOL InitInstance()
{// dll loaded
hModule = m_hInstance; // store module handle
_MESSAGE("Attaching Submodule ...");
return true;
}
virtual int ExitInstance()
{// dll unloaded
_MESSAGE("Detaching Submodule ...");
return CWinApp::ExitInstance();
}
} gApp;
#endif
显然,MFC 是在 MFC 配置中定义的,而不是其他的。
我怀疑这些信息是否足以解决这个问题;我意识到这一点。我真正希望了解的是在哪里寻找可能导致此错误的问题。我很乐意提供您需要的任何信息 — 一旦我知道需要。
感谢任何提示。
【问题讨论】:
-
你试过在调试器中运行它吗?这应该可以快速为您查明错误。
-
你当然可以在调试器下运行它。您需要在代码的早期设置好断点并分配主机应用程序。
-
您是否尝试过从测试程序而不是从原始主机程序加载 DLL?如果幸运的话,它会出现同样的错误,这会使调试变得简单得多。
-
也许吧,但如果错误在 DLL 加载后立即发生,它不会有任何区别,不是吗?
-
DllMain(因此可能是 InitInstance)是一种特殊情况;从 DllMain 调用时,在其他地方运行良好的代码可能会中断。
标签: c++ windows dll loadlibrary