2016-05-04 2 views
-3

Ich habe versucht, eine universelle DLL zu machen, wo ich es in einen Prozess injizieren kann & ein Fenster würde auftauchen. Ich habe alle erforderlichen Funktionen wie WinMain (ich nannte meine Initiate und nannte es manuell), DllWindowProcedure und DllMain. Nach der Kompilierung gibt es jedoch eine Warnung und keine Fehler - ich glaube, es ist ein logischer Fehler. Wenn Sie irgendwelche Probleme oder etwas, das ich verbessern kann, entdecken, lassen Sie es mich wissen!Warum erscheint das Fenster nie, obwohl alle erforderlichen Funktionen vorhanden sind?

Warnung:

1> Main.cpp (43): Warnung C4060: switch-Anweisung enthält keinen 'Fall' oder 'default' Etiketten

Code:

#include <Windows.h> 

HINSTANCE InjectedModuleHandle; 

LRESULT CALLBACK DllWindowProcedure(HWND, UINT, WPARAM, LPARAM); 

DWORD WINAPI DllThreadProcedure(void * Data) 
{ 
    MessageBoxA(NULL, (LPCSTR)"Welcome to Flames v1.1!", (LPCSTR)"Startup Message", NULL); 
    MSG Messages; 
    WNDCLASSEX WindowClass; 
    WindowClass.hInstance = InjectedModuleHandle; 
    WindowClass.lpszClassName = L"DllWindowClass"; 
    WindowClass.lpfnWndProc = DllWindowProcedure; 
    WindowClass.style = CS_DBLCLKS; 
    WindowClass.cbSize = sizeof(WNDCLASSEX); 
    WindowClass.hIcon = LoadIcon(NULL, IDI_APPLICATION); 
    WindowClass.hIconSm = LoadIcon(NULL, IDI_APPLICATION); 
    WindowClass.hCursor = LoadCursor(NULL, IDC_ARROW); 
    WindowClass.lpszMenuName = NULL; 
    WindowClass.cbClsExtra = 0; 
    WindowClass.cbWndExtra = 0; 
    WindowClass.hbrBackground = (HBRUSH)RGB(255, 255, 255); 
    RegisterClassEx(&WindowClass); 
    HWND Window = CreateWindowEx(0, L"DllWindowClass", L"Flames v1.1 - By XenoSaga3000", (WS_SYSMENU | WS_MINIMIZEBOX), 200, 200, 500, 450, FindWindow(NULL, L"ROBLOX"), CreateMenu(), InjectedModuleHandle, NULL); 
    ShowWindow(Window, SW_SHOWNORMAL); 
    while (GetMessage(&Messages, NULL, 0, 0)) 
    { 
     TranslateMessage(&Messages); 
     DispatchMessage(&Messages); 
    }; 
    return 1; 
}; 

LRESULT CALLBACK DllWindowProcedure(HWND Window, UINT Message, WPARAM WParameter, LPARAM LParameter) 
{ 
    switch (Message) 
    { 
     case WM_COMMAND: 
      switch(WParameter) 
      { 
       //Check for commands here. 
      }; 
     break; 
     case WM_DESTROY: 
      PostQuitMessage(0); 
     break; 
     default: 
      return DefWindowProc(Window, Message, WParameter, LParameter); 
    }; 
    return 0; 
}; 

bool APIENTRY DllMain(HMODULE DllInstance, DWORD Reason, LPVOID Reserved) 
{ 
    if(Reason == DLL_PROCESS_ATTACH) 
    { 
     InjectedModuleHandle = DllInstance; 
     CreateThread(0, NULL, DllThreadProcedure, NULL, NULL, NULL); 
    }; 
    return TRUE; 
}; 
+0

Probieren Sie zunächst etwas Einfacheres aus, z. B. das Dialogfeld, um zu sehen, ob Ihre DLL überhaupt korrekt geladen ist. – Drop

+0

Ich weiß für die Tatsache, die DLL wurde injiziert .. –

+1

'wechseln (WParameter) {};' - Deshalb erhalten Sie eine Warnung. – IInspectable

Antwort

2

Sie können dieses blog für ein Beispiel für Ihren Fall betrachten.

Einer der Unterschiede besteht darin, dass DllMain HINSTANCE als das Instanzhandle für die Fensterklasse bereitgestellt wird. GetModuleHandle(NULL) gibt das Instanzhandle des aufrufenden Prozesses anstelle der DLL zurück.

Beachten Sie, dass Windows-API-Aufrufe wie CreateThread von DllMain nicht empfohlen werden, siehe here.

+0

CreateThread ist ziemlich gut zu verwenden, wenn sicher aufgerufen wird. –

+0

@Levi Branch, anscheinend gibt es unterschiedliche Meinungen dazu. Hat das Blog-Beispiel Ihr Problem behoben? –

+1

@TonPlooij: Der Wortlaut von [Dynamic-Link Library Best Practices] (https://msdn.microsoft.com/en-us/library/windows/desktop/dn633971.aspx) (* "sollte nie [...] Aufruf 'CreateThread'" *) ist die Quelle der Verwirrung. Was dies wirklich zu sagen versucht, ist, dass die Synchronisation innerhalb von DllMain zu Deadlocks führen kann. Und wenn Sie einen Thread erstellen, implementieren Sie fast immer eine Art von Synchronisation. Es ist in Ordnung, einen Thread selbst zu erstellen, da Sie sicher annehmen können, dass * kernel32.dll * immer einem laufenden Prozess zugeordnet ist. – IInspectable

Verwandte Themen