好的,我有一种情况,我在我写的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配置中定义的,而不是其他。
我怀疑这是解决这个问题的足够信息;我意识到了。我实际上希望学习的是在哪里寻找可能导致此错误的问题。我很乐意提供您需要的任何信息 - 一旦我知道它是必要的。
感谢您的任何提示。
答案 0 :(得分:14)
好的,我的一个朋友回答了这个问题(不知道他是否有一个StackOverflow帐户;不会再纠缠他两次)。
这笔交易是我有一个全局对象,其中一个类有一个构造函数,它调用一个依赖于另一个全局对象的函数(具有讽刺意味的是,所讨论的函数是_MESSAGE
,但到了时间{调用{1}}或DllMain
,该函数运行正常)。 C ++不允许你指定全局变量初始化的顺序,所以当这个全局构造函数运行时(当计算机试图加载DLL时),它通过尝试使用另一个尚未使用的全局变量而导致内存错误创造了。
所以......这就是答案。一个非常具体的案例,但我想如果其他人发现他们得到了998个错误并且需要知道要检查哪些类型的问题,这是需要注意的事项:确保所有的全局变量都是独立的!