2016-09-07 2 views
0

Ich habe eine kurze DLL erstellt, die eine MessageBox anzeigen wird, wenn es von einem Prozess geladen wird. Das Meldungsfeld wird jedoch zweimal angezeigt. Es sieht also so aus, als ob die DLL-Exportfunktion zweimal aufgerufen wird. Könnten Sie bitte sehen, ob etwas in meinem Code geändert werden muss, damit die MessageBox nur einmal angezeigt wird?DLL-Exportfunktion, die zweimal aufgerufen wird

#include <windows.h> 
#include <stdio.h> 

__declspec(dllexport) void sampledllmain() 
{ 
    MessageBox(NULL, "sample text","sample title", 0); 
} 

BOOL APIENTRY DllMain(HANDLE hHandle, DWORD dwReason, LPVOID Reserved) 
{ 
    switch(dwReason) 
    { 
     case DLL_PROCESS_ATTACH: 
       sampledllmain(); 
       break; 
    } 
    return 1; 
} 

lade ich die DLL mit rundll32 wie unten dargestellt:

rundll32 "path to DLL",sampledllmain 
+0

Ihr Aufruf 'mit' DllMain' und mit dem 'rundll32' Aufruf sampledllmain' anruft, wählen Sie bitte eine zweite Dummy-Funktion für Ihre Tests hinzufügen, so dass Sie verwenden können,' rundll32 "Pfad zu DLL", dummy' – dvhh

+2

Natürlich würde es zweimal aufgerufen werden. Entferne 'sampledllmain' von' DllMain'. – Ari0nhh

Antwort

2

Wie die information page about rundll32.exe beschrieben:

  1. Es lädt die angegebene DLL über LoadLibrary().
  2. Er erhält die Adresse der Funktion über GetProcAddress().
  3. Es ruft die Funktion auf und übergibt die Befehlszeile, die das ist.

In Ihrem Fall:

  1. Wenn LoadLibrary() aufgerufen wird, ruft sie DllMain, in Ihrem Fall DllMainsampledllmain nennt.
  2. Erhält die Adresse sampledllmain
  3. Anrufe sampledllmain (zum zweiten Mal).

Ihr Problem zu beheben:

  • eine zweite Funktion hinzufügen dummy (zum Beispiel)
  • Verwendung rundll32 "path to DLL",dummy auf der Kommandozeile

PS: Auf einer zusätzlichen Anmerkung auch Sie könnten debug your dll gibt es guides that describe how to do it

Ein Beispiel mit MessageBox Anruf in dllMain

#include <windows.h> 
__declspec(dllexport) void sample(void) 
{ 
    MessageBox(NULL, "sample text test", "sample title test", 0); 
} 
BOOL APIENTRY DllMain(HMODULE hModule, 
         DWORD ul_reason_for_call, 
         LPVOID lpReserved 
        ) 
{ 
    switch (ul_reason_for_call) 
    { 
    case DLL_PROCESS_ATTACH: 
     MessageBox(NULL, "attach", "DllMain", 0); 
     break; 
    case DLL_THREAD_ATTACH: 
     break; 
    case DLL_THREAD_DETACH: 
     break; 
    case DLL_PROCESS_DETACH: 
     MessageBox(NULL, "detach", "DllMain", 0); 
     break; 
    } 
    return TRUE; 
} 

Run mit rundll32.exe lib.dll,sample

+0

Ich möchte, dass die MessageBox angezeigt wird, wenn die DLL vom Prozess geladen wird. Aber wenn ich den Aufruf von MessageBox direkt in der DllMain-Funktion platziere, wird es 4 Mal aufgerufen. Ich habe irgendwo gelesen, dass wir eine andere Exportfunktion für es erstellen und es von DLL-Haupt basierend auf einer Bedingung wie DLL_PROCESS_ATTACH aufrufen sollen. Also, wie zeige ich die Message Box beim Aufruf von DllMain() an? –

+0

aber warum rufst du es ein zweites Mal mit 'rundll32.exe' (übergibt es als Parameter)? – dvhh

+0

Ich benutze rundll32 nur zum Testen. Wie kann ich die MessageBox-Funktion nur einmal ausführen, wenn eine DLL geladen ist? Wenn LoadLibrary() verwandt wird, um eine DLL zu laden, wird DllMain() - Funktion automatisch aufgerufen.Also, im Idealfall, wenn ich einen Aufruf direkt innerhalb DllMain() für MessageBox, dann sollte es MessageBox() nur einmal richtig ausführen? Warum passiert es dann zweimal oder öfter? Sie können das selbst testen. –

Verwandte Themen