C++加载库ERROR_NOACCESS "Invalid access to memory location."



好的,我有一种情况,我在我编写的DLL上调用LoadLibrary。这个调用LoadLibrary返回错误#998,或ERROR_NOACCESS"无效访问内存位置。"

DLL在一种配置中使用MFC,而在另一种配置中不使用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配置中定义的,而不是其他。

我怀疑这是足够的信息来解决这个问题;我知道。我实际上希望了解的是在哪里查找可能导致此错误的问题。我很乐意提供你需要的任何信息-一旦我知道它是需要的。

好的,这个问题是由我的一个朋友回答的(不知道他是否有一个StackOverflow帐户;我不打算再给他回答两次了。

交易是我有一个全局对象,其类有一个构造函数,调用依赖于另一个全局对象的函数(具有讽刺意味的是,所讨论的函数是_MESSAGE,但到DllMainInitInstance被调用时,该函数工作正常)。c++不允许指定全局变量初始化的顺序,所以当这个全局变量的构造函数运行时(当计算机试图加载DLL时),它会因为试图使用另一个尚未创建的全局变量而导致内存错误。

所以…这就是答案。这是一个非常特殊的情况,但我想如果其他人发现他们得到998个错误,需要知道要检查哪些问题,这是要寻找的东西:确保所有全局变量都是独立的!

最新更新