微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C LoadLibrary ERROR_NOACCESS“对内存位置的访问无效.”

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

我怀疑这是解决这个问题的足够信息;我意识到了.我实际上希望学习的是在哪里寻找可能导致此错误的问题.我很乐意提供您需要的任何信息 – 一旦我知道它是必要的.

谢谢你的任何提示.

解决方法

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

这个交易是我有一个全局对象,它的类有一个构造函数,它调用一个依赖于另一个全局对象的函数(具有讽刺意味的是,所讨论的函数是_MESSAGE,但是当DllMain或InitInstance被调用时,该函数工作良好). C不允许你指定全局变量初始化的顺序,所以当这个全局构造函数运行时(当计算机试图加载DLL时),它通过尝试使用另一个尚未使用的全局变量导致内存错误创造了.

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

原文地址:https://www.jb51.cc/c/115799.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐