DLL代理调用LoadLibrary导致异常:访问冲突读取位置0x00000250

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DLL代理调用LoadLibrary导致异常:访问冲突读取位置0x00000250相关的知识,希望对你有一定的参考价值。

我正在尝试为dinput8.dll创建代理dll。 .exe加载我的自定义DLL(代理DLL)dinput8.dll。 dinput8_x86.dll是我的代理dll加载的原始.dll的重命名版本。一切正常,但当我删除MessageBox代码行,然后重建项目,我有错误:

localhost_dinput8.exe中0x772BBC61处抛出异常:0xC0000005:访问冲突读取位置0x00000250。

localhost_dinput8.exe中0x772BBC61处的未处理异常:0xC000041D:在用户回调期间遇到未处理的异常。

跟踪LoadLibrary(_T(".\dinput8_x86.dll"));时抛出异常。我不知道为什么,任何人都可以帮助我,我不希望每次我的dll加载时都显示该消息框。如果我放回代码行:MessageBox - >异常是GONE。这是我的代理DLL的示例代码。

#include "stdafx.h"
#include <windows.h>
#include <stdio.h>
#include <tchar.h>
#pragma pack(1)

FARPROC p[5] = { 0 };

extern "C" BOOL WINAPI DllMain(HINSTANCE hInst, DWORD reason, LPVOID)
{
    static HINSTANCE hL;
    if (reason == DLL_PROCESS_ATTACH)
    {
        hL = LoadLibrary(_T(".\dinput8_x86.dll")); // The exception at here
        if (!hL) return false;
        p[0] = GetProcAddress(hL, "DllGetClassObject");
        p[1] = GetProcAddress(hL, "DllCanUnloadNow");
        p[2] = GetProcAddress(hL, "DirectInput8Create");
        p[3] = GetProcAddress(hL, "DllRegisterServer");
        p[4] = GetProcAddress(hL, "DllUnregisterServer");
//MessageBox(NULL,_T("Hello World"),_T("Hi"),NULL);//Exception gone when uncomment this line
    }
    if (reason == DLL_PROCESS_DETACH)
        FreeLibrary(hL);
    return TRUE;
}

extern "C" __declspec(naked) void Proxy_DllGetClassObject()
{
    __asm
    {
        jmp p[0 * 4];
    }
}

extern "C" __declspec(naked) void Proxy_DllCanUnloadNow()
{
    __asm
    {
        jmp p[1 * 4];
    }
}

extern "C" __declspec(naked) void Proxy_DirectInput8Create()
{
    __asm
    {
        jmp p[2 * 4];
    }
}

extern "C" __declspec(naked) void Proxy_DllRegisterServer()
{
    __asm
    {
        jmp p[3 * 4];
    }
}

extern "C" __declspec(naked) void Proxy_DllUnregisterServer()
{
    __asm
    {
        jmp p[4 * 4];
    }
}

这是我的定义文件:dinput8.def

EXPORTS
DllGetClassObject=Proxy_DllGetClassObject @1
DllCanUnloadNow=Proxy_DllCanUnloadNow @2
DirectInput8Create=Proxy_DirectInput8Create @3
DllRegisterServer=Proxy_DllRegisterServer @4
DllUnregisterServer=Proxy_DllUnregisterServer @5

附加信息:

  • 我正在使用Win7 Professional x64更新
  • Visual Studio 2015
  • 在win32 x86配置文件上构建项目

编辑:

我意识到,如果我将MessageBox替换为WinUser.h中的任何其他API,如MessageBeep或ShowCursor,则不再显示异常。但如果我删除它,异常显示。我还是不知道为什么?

答案

来自Dynamic-Link Library Best Practices

您永远不应该在DllMain中执行以下任务:

致电LoadLibraryLoadLibraryEx(直接或间接)。这可能会导致死锁或崩溃。

以上是关于DLL代理调用LoadLibrary导致异常:访问冲突读取位置0x00000250的主要内容,如果未能解决你的问题,请参考以下文章

将 std::vector 转换为数组然后 p/调用它会在编组期间导致 mscorlib.dll 中的访问冲突异常

在 DLL 中哪里调用 LoadLibrary?

Debug版DLL LoadLibrary R6034异常的原因及解决

VC++ 解决dll库动态库加载失败问题(调用LoadLibrary加载失败)(附源码)

使用 loadLibrary() 在 java 中调用 c++ dll

Matlab调用Fortran编译的DLL——未完待续