【问题标题】:C++ LoadLibrary ERROR_NOACCESS "Invalid access to memory location."C++ LoadLibrary ERROR_NOACCESS“对内存位置的访问无效。”
【发布时间】: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


【解决方案1】:

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

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

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

【讨论】:

  • 有一些标准技术可以强制执行静态初始化的顺序
  • 好吧,我不知道(我猜我的朋友也不知道)。关键是,我没有使用它们。我会调查的。
  • @DavidHeffernan 参考会很有用。
  • 这对我有用。在 DLL 中的静态初始化中存在指针错误,该错误仅在手动 LoadLibrary() 调用期间触发,而不是通过 DLL 的导入库直接链接到它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-12
  • 1970-01-01
  • 1970-01-01
  • 2011-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多