Ich versuche, eine Proxy-DLL für dinput8.dll zu erstellen. Die .exe lädt meine eigene dll (proxy dll) dinput8.dll. dinput8_x86.dll wird umbenannt Version der ursprünglichen .dll, die von meiner Proxy-DLL geladen. Alles funktioniert gut, aber wenn ich die MessageBox Codezeile zu entfernen, dann das Projekt neu, ich habe den Fehler bekommt:DLL Proxy-Aufruf LoadLibrary Ursache Ausnahme: Zugriffsverletzung beim Lesen der Position 0x00000250
Exception thrown at 0x772BBC61 in localhost_dinput8.exe: 0xC0000005: Access violation reading location 0x00000250.
Unhandled exception at 0x772BBC61 in localhost_dinput8.exe: 0xC000041D: An unhandled exception was encountered during a user callback.
Die Ausnahme wirft, wenn Spur über LoadLibrary(_T(".\\dinput8_x86.dll"));
. Ich weiß nicht warum, kann mir bitte jemand helfen, ich möchte diese Nachrichtenbox nicht jedes Mal zeigen, wenn meine DLL geladen ist. Wenn ich die Codezeile zurücksetze: MessageBox -> die Ausnahme ist GONE. Hier ist mein Beispielcode der Proxy-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];
}
}
Hier ist meine Definitionsdatei: dinput8.def
EXPORTS
DllGetClassObject=Proxy_DllGetClassObject @1
DllCanUnloadNow=Proxy_DllCanUnloadNow @2
DirectInput8Create=Proxy_DirectInput8Create @3
DllRegisterServer=Proxy_DllRegisterServer @4
DllUnregisterServer=Proxy_DllUnregisterServer @5
Zusätzliche Informationen:
Im mit Win7 Professional x64 Update voll
Visual Studio 2015
bauen Projekt auf win32 x86 Profil
bearbeiten:
Mir ist klar, dass, wenn ich MessageBox zu anderen API ersetzen wie MessageBeep oder Showcursor welche in WinUser.h, die Ausnahme wird nicht mehr angezeigt. Aber wenn ich es entferne, erscheint eine Ausnahme. Ich weiß immer noch nicht warum?
Können Sie mich leiten, wie Loadlibrary außerhalb DllMain nennen? Ich versuche, eine Funktion zu erstellen, um LoadLibrary auszuführen, aber immer noch eine Ausnahme zu verursachen. Sorry, wenn meine Frage dumm ist, bin ich neu in C++: p –