Ich debugge eine C ++ Win32-Anwendung, und ich möchte eine beliebige Win32-API aus dem Kontext dieses Prozesses aufrufen, als ob das Programm diese Codezeile ausgeführt hätte:
%Vor%Aber wenn Sie das in das Direktfenster eingeben, erhalten Sie:
%Vor% Bearbeiten: Mit dem vollständigen Namen der Funktion {,,user32.dll}_NtUserDestroyWindow@4
kann ich das Direktfenster dazu bringen zu verstehen, welche Funktion ich meine und die Adresse der Funktion anzeigen:
Aber wenn ich versuche, es anzurufen, passiert das:
%Vor%Ist es überhaupt möglich, eine C-Funktion vom Direktfenster aus aufzurufen, oder belle ich den falschen Baum an?
Sobald Sie die Funktionsadresse haben (wie Sie es in der aktualisierten Frage getan haben), können Sie versuchen, sie an einen Funktionszeiger zu übergeben und aufzurufen:
%Vor% Der erste Teil von diesem wandelt die Adresse in BOOL (*)(HWND)
um. Dies ist ein Zeiger auf eine Funktion, die einen Parameter HWND
übernimmt und BOOL
zurückgibt. Dann wird der Funktionszeiger dereferenziert und aufgerufen. Stellen Sie sicher, dass die Parameter korrekt sind, sonst werden schlimme Dinge passieren. Auf 64-Bit-Systemen und HWND
können 64 Bit sein, so dass es Ihnen möglicherweise nicht möglich ist, den Parameter als int
zu übergeben.
Bearbeiten: Siehe die Kommentare für die vollständige Geschichte.
Ich glaube, das Problem ist, dass die C ++ EE Probleme hat, den Kontext von DestroyWindow aufzulösen. Probieren Sie Folgendes aus
%Vor%Ich bin mir nicht sicher, ob die Methodenaufrufsyntax diesen Qualifizierungsstil unterstützt (nur zum Casting in der Vergangenheit verwendet). Aber es ist einen Versuch wert.
BEARBEITEN Sie müssen oder müssen möglicherweise keine hinzufügen! nach dem Schließen}. Es ist eine Weile her, seit ich diese Syntax benutzt habe und ich verwechsle sie oft mit der entsprechenden Windbg.
Ich habe einen Workaround gefunden, aber ich würde trotzdem lieber das Direktfenster verwenden.
Die Problemumgehung ist:
DestroyWindow
Sichern Sie den Aufruf-Stack für den Aufrufer von DestroyWindow
, der folgendermaßen aussieht:
6D096A9D push ecx
6D096A9E ruft dword ptr ds auf: [6D0BB4B8h]
Setzen Sie einen Haltepunkt für die Anweisung push ecx
und löschen Sie den Wert für DestroyWindow
ecx
ecx
im Debugger auf den gewünschten Wert und gehen Sie über push/call
ecx
wieder her und verwendet Set Next Statement, um zu push
zurückzukehren, dann Weiter Es ist langwierig, aber es funktioniert. Es wird davon ausgegangen, dass Sie die Anwendung die entsprechende API nach Belieben aufrufen können.
Tags und Links c c++ visual-studio debugging winapi