C++ LoadLibrary ERROR_NOACCESS "Invalid access to memory location."

标签 c++ windows dll loadlibrary

好的,所以我有一种情况,我在我编写的 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 配置中定义的,而不是其他地方。

我怀疑这些信息是否足以解决这个问题;我意识到这一点。我真正希望了解的是在哪里寻找可能导致此错误的问题。我很乐意提供您需要的任何信息 - 一旦我知道需要它。

感谢任何提示。

最佳答案

好吧,我的一个 friend 回答了这个问题(不知道他是否有 StackOverflow 帐户;不想缠着他回答两次)。

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

所以...这就是答案。一个非常具体的案例,但我想如果其他人发现他们收到 998 错误并且需要知道要检查哪些类型的问题,这就是要寻找的东西:确保所有全局变量都是独立的!

关于C++ LoadLibrary ERROR_NOACCESS "Invalid access to memory location.",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7693596/

相关文章:

c++ - 使用 QImage::setText() 将二进制数据存储在 PNG 文件中

c++ - 默认参数和变量列表

c - 如何在 TWAIN 中最大化扫描区域?

windows - 静默安装 Sublime

PYTHON DLL 加载失败

c# - 从 C# 调用 C 结构数据

c++ - 矩阵到 EulerAngles

c++ - 用于 C/C++ 剽窃检测的变量重命名

c# - 类似于任务管理器获取Windows中空闲进程的总CPU时间

dll - 使用 MinGW64 在 Windows 中创建 OpenSSL dll