Frage zu inline _asm
-
warum funktioniert, dieser einfache Win API call trotz fehlerfreier Kompilierung nicht?
#include <windows.h> int main() { char *classname ="Progman"; HWND hListView=NULL; _asm { push 0 push classname call FindWindow mov hListView, eax } return 0; }
-
Was bedeutet "funktioniert nicht"?
BTW: es hat absolut nix mit C zu tun...
-
Dieser Thread wurde von einem unserer Moderatoren verschoben,
aus dem ANSI C Forum in das Assembler Forum.Für die Zukunft bitte beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
naja ich bekomm die Fehlermeldung, dass das Programm ein Problem verursacht hat und beendet werden muss.
PS: dachte das Assembler Forum wäre für reines Assembler, deshalb konnt ich mich ned recht entscheiden.
-
Füge mal nach call FindWindow folgendes ein:
add esp, 8
-
gleicher fehler, bah jetzt hock ich schon den ganzen tag da dran und google will auch nix ausspucken.
Ich versteh nicht, warum z.b.
push offset classnamenicht zugelassen is.
-
- Windows API Funktionen sind "stdcall", also:
- argumente über stack von rechts nach links
- Aufrufer holt die Daten vom Stack (das "add esp, 8")
Des weiteren ist FindWindow eine Funktion aus einer Import-Library, mithin ein Funktionszeiger. Der korrekte Syntax ist damit:
#include <windows.h>
int main() { char *classname ="Progman"; HWND hListView=NULL; _asm { push 0 push classname call DWORD PTR [FindWindow] add esp, 8 mov hListView, eax } return 0; }
- Windows API Funktionen sind "stdcall", also:
-
peterchen schrieb:
- Windows API Funktionen sind "stdcall", also:
- Aufrufer holt die Daten vom Stack (das "add esp, 8")
BÖSER FEHLER
Bei der Aufrufkonvention stdcall nimmt die GERUFENE Funktion (hier also FindWindow) die Parameter vom Stack. Das add esp, 8 nach dem Funktionsaufruf ist falsch!!!!
Alle Win-API-Funktionen folgen der stdcall-Konvention. Es gibt nur eine Ausnahme, nämlich wsprinf, weil diese Funktion eine variable Parameterliste verarbeiten kann. Das wird aber nur von der Aufrufkonvention cdecl unterstützt.
Ciao...
- Windows API Funktionen sind "stdcall", also:
-
Ups sorry. Nach 12h im Job ist die MSDN immer so verschwommen
ok, also add esp, 8 raus und gut ist.
-
hmm das mit den Aufrufkonventionen hab ich noch nie gehört, wo kann man sich da schlau machen??
ich find es irgendwie komisch, dass ich in "normalem" assembler einen api call ohne den pointer auf die funktion realisieren kann. Oder kann man da beides machen, oder lieg ich etwa komplett daneben?
Danke jedenfalls für die Antwort, der code läuft einwandfrei.
-
Kommt beim "normalen Assembler" dann ja drauf an, wie das FindWindow - Symbol definiert ist.
Aufrufkonventionen: steht in der MSDN drin
__stdcall
__cdecl
__fastcall
thiscallund dann gibt es noch ein paar hunder Macros, die diese Calling-Conventions platformspezifisch anpassen (z.B. WINAPI und CALLBACK)