我正在尝试为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 update full
Visual Studio 2015
在win32 x86个人资料中构建项目
修改:
我知道如果我将 MessageBox 替换为 WinBserh 中的 MessageBeep 或 ShowCursor 之类的任何其他API > strong>,例外不再显示。但如果我删除它,异常显示。我还是不知道为什么?
答案 0 :(得分:0)
来自Dynamic-Link Library Best Practices:
您永远不应在
DllMain
内执行以下任务:致电
LoadLibrary
或LoadLibraryEx
(直接或间接)。这可能会导致死锁或崩溃。