2017-12-23 47 views
0

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?

Antwort

0

Von Dynamic-Link Library Best Practices:

You should never perform the following tasks from within DllMain :

Call LoadLibrary or LoadLibraryEx (either directly or indirectly). This can cause a deadlock or a crash.

+0

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 –

Verwandte Themen