C ++ LoadLibrary ERROR_NOACCESS“访问内存位置无效”。

好的,所以我有一种情况,在我写的DLL上调用LoadLibrary 。 这个对LoadLibrary的调用返回错误#998,或者ERROR_NOACCESS “对存储器位置的访问无效”。

有问题的DLL在一个configuration中使用MFC,而不是在另一个configuration中; 只有MFCconfiguration有这个问题。 它曾经工作 ,但我不知道我改变了什么:我实际上移动到非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是在MFCconfiguration中定义的,不然。

我怀疑这是解决这个问题的足够的信息; 我意识到这一点。 我真正希望学到的是在哪里寻找可能导致这个错误的问题。 我很乐意提供你需要的任何信息 – 一旦我知道这是需要的。

感谢您的任何提示。

好的,这个问题是由我的一个朋友回答的(不知道他是否有一个StackOverflow帐户;不会用两次回答来纠缠他)。

这个协议是我有一个全局对象,它的类有一个构造函数,它调用一个依赖另一个全局对象的函数(具有讽刺意味的是,有问题的函数是_MESSAGE ,但是在DllMainInitInstance的时候,函数工作正常)。 C ++不允许你指定全局变量被初始化的顺序,所以当这个全局的构造函数运行的时候(当计算机试图加载DLL的时候),它试图使用另一个没有被全局变量的全局变量尚未创建。

所以…这就是答案。 一个非常具体的例子,但是我猜如果其他人发现他们得到了998个错误,并且需要知道需要检查什么样的问题,那么这个东西是需要的:确保所有的全局变量都是独立的!