2016-06-10 11 views
-2

Ich lese die MSDN-Dokumentation auf AllocConsole, ich verstehe kein Wort, das sich auf seinen Zweck bezieht. In einem sehr kleinen DLL-Tutorial hängt er eine DLL an eine einfache Konsolenanwendung an und in der DLL wird AllocConsole aufgerufen. Wenn ich es aus dem DLL-Code entferne, ändert sich während der Laufzeit nichts. Also bin ich neugierig auf seinen Hauptzweck:Alloconsole Fragen

case DLL_PROCESS_ATTACH: 
AllocConsole(); 
printf("\nInjected Successfully!"); 
msgBox(true); 
break; 

Dies hat keinen Unterschied während der Laufzeit als wenn ich AlloConsole entfernen.

+0

Was ist, wenn die DLL in z. eine GUI-Anwendung ohne vorhandene Konsole? Wenn Sie den Rückgabewert der Funktion überprüfen, werden Sie wahrscheinlich feststellen, dass es in der Konsolenanwendung fehlschlägt. –

+3

Dieser Code ist WRONG WRONG WRONG. Sie sollten [* nie * irgendeine Art von komplexer Initialisierung in 'DllMain' machen] (https://msdn.microsoft.com/en-us/library/windows/desktop/dn633971.aspx#general_best_practices). Das Aufrufen von printf und MsgBox sind * gigantische * Verstöße gegen diese Regel und immer falsch. AllocConsole ist zweifelhaft; Ich würde irren, wenn ich es nicht tue. Egal welches Tutorial Sie gerade lesen, hören Sie auf, es zu lesen. Die Person, die es geschrieben hat, weiß nicht, was er tut. (Abgesehen davon, selbst wenn es technisch möglich wäre, eine Konsole in 'DllMain' zuzuordnen, macht es für eine DLL einfach keinen Sinn, dies zu tun.) –

+0

@CodyGray Ich habe eine andere Header-Datei erstellt, die in der Haupt-cpp und enthalten ist eine neue cpp-Datei, die ich gemacht habe. Die Header-Datei definiert eine Funktion, die dann in der neuen cpp-Datei erweitert wird und ab dem Zeitpunkt aufgerufen wird, an dem die Dll angehängt ist. Ist das der richtige Weg, das zu strukturieren? –

Antwort

1

Die MSDN-Dokumentation für AllocConsole sagt:

Ein Prozess kann mit nur einer Konsole zugeordnet werden, so dass die AllocConsole Funktion schlägt fehl, wenn der aufrufende Prozess bereits eine Konsole hat. Ein Prozess kann die FreeConsole-Funktion verwenden, um sich von der aktuellen Konsole zu lösen. Dann kann AllocConsole aufgerufen werden, um eine neue Konsole zu erstellen, oder AttachConsole zum Anhängen an eine andere Konsole.

Also, rufen Sie es, wenn der Prozess keine Konsole hat, aber Sie möchten, dass es eine hat. Ein gängiges Beispiel dafür ist eine Windows-Anwendung (GUI), die eine Konsole nicht automatisch erstellt und anzeigt. (Im Gegensatz zu einer Konsolenanwendung, die Alloconsole ziemlich nutzlos macht.)

+0

@CodyGray Ich verstehe jetzt, als Sie die GUI erklärten, ich benutzte nur ein einfaches C# -Konsolenprogramm. Aber jetzt, wenn ich an eine GUI anschließe, mit AllocConsole() in meinem Code, erhalte ich eine Laufzeitfehlerausnahme von dem einfachen Injektor, den ich vorübergehend benutzt habe. http://www.mediafire.com/download/tuxgoufx812181u/HV_INJECT.cs –

+0

@Aaron Ich verstehe nicht, was Sie sagen wollen. Eine GUI-Anwendung hat kein Konsolenfenster, wenn Sie AlloConsole nicht explizit aufrufen. Was du tun kannst, wenn du willst, aber du solltest es * nicht * in DllMain machen. Das war der Punkt meiner Bemerkung zu dieser Frage. Wenn AllocConsole nicht an eine GUI anfügt, hängt es ein Konsolenfenster an Ihre Anwendung an. Wenn Sie nur ein Konsolenfenster wollen, dann erstellen Sie keine "Windows-Anwendung", sondern machen Sie einfach eine "Konsolenanwendung". Das Konsolenfenster wird automatisch angezeigt, ohne dass Sie Code schreiben müssen. –

+0

Wenn Sie eine zusätzliche Frage zu der Laufzeitausnahme haben, die Sie von diesem Code erhalten, sollten Sie eine neue Frage dazu stellen.Stellen Sie sicher, dass Sie den Code in die eigentliche Frage einfügen. Niemand möchte einen dubiosen Download-Dienst verwenden müssen, nur um den Code zu sehen. :-) –