Zitat von
MathiasSimmack:
Dankeschön kann ich da nur sagen.
Keine Ursache
Zitat von
MathiasSimmack:
was genau passiert im Assemberteil?
Code:
[color=blue] { EBX muss gesichert werden (wird auf dem Stack abgelegt) }[/color]
[color=gray] push ebx[/color]
[color=blue] { Bei 'array of' befindet sich vor dem ersten Element der Wert von High }[/color]
[color=gray] mov ecx,[Arguments-$04][/color]
[color=blue] { Hier wird der Offset zum letzten Element zusammengebaut (High*4) }[/color]
[color=gray] mov ebx,ecx[/color]
[color=gray] shl ebx,$02[/color]
[color=blue] { Aus dem High(Arguments) wird nun Length(Arguments) (+1) }[/color]
[color=gray] inc ecx[/color]
[color=blue] { Prüfen ob es gar keine zusätzlichen Argumente gibt (ecx ist 0) }[/color]
[color=blue] { Wenn dann geht es sofort zur Übergabe der benötigten Parameter }[/color]
[color=gray] jz @@call[/color]
[color=blue] { Erste Element holen und dann zum letzten Element wechseln }[/color]
[color=blue] { cdecl erwartet die Parameter in 'umgekehrter' Reihenfolge }[/color]
[color=gray] mov edx,[Arguments][/color]
[color=gray] add edx,ebx[/color]
[color=blue] { Aktuelles Element auf dem Stack ablegen }[/color]
[color=gray]@@loop: push dword ptr [edx][/color]
[color=blue] { Zum nächsten Element wechseln (rückwärts) }[/color]
[color=gray] sub edx,$04[/color]
[color=blue] { ECX um 1 verringern und auf 0 prüfen }[/color]
[color=blue] { solange ECX <> 0 weiter mit Schleife }[/color]
[color=gray] loop @@loop[/color]
[color=blue] { Nun die benötigten Parameter auf dem Stack ablegen }[/color]
[color=gray]@@call: push dword ptr [Style][/color]
[color=gray] push dword ptr [Title][/color]
[color=gray] push dword ptr [Msg][/color]
[color=gray] push dword ptr [Wnd][/color]
[color=gray] push dword ptr [Inst][/color]
[color=blue] { Funktion aufrufen (Ergebnis ist dann in EAX) }[/color]
[color=gray] call FNShellMessageBox[/color]
[color=blue] { Stack mit benötigten Parametern abräumen }[/color]
[color=blue] { ($14, aber ebx basiert nicht auf Length, sondern auf High) }[/color]
[color=gray] add esp,$18[/color]
[color=blue] { Stack mit zusätzlichen Argumenten abräumen }[/color]
[color=gray] add esp,ebx[/color]
[color=blue] { Ergebnis in Result speichern }[/color]
[color=gray] mov [Result],eax[/color]
[color=blue] { EBX wiederhergestellen (vom Stack holen) }[/color]
[color=gray] pop ebx[/color]
Zitat von
MathiasSimmack:
Gab´s nicht eine Lösung in ... äh ... normaler Delphi-Sprache
Leider nicht, ...
Delphi-Quellcode:
asm
push ...
end;
ShellMessageBox(...)
asm
add esp,...
end;
...wäre
viel zu unsicher (da es von der Annahme ausgeht, dass der Compiler keine Anweisung zischen die
asm-Bläcke und den Aufruf der Funktion packt).
Gruss Nico
ps: kurz vor Deiner Antwort hab ich oben noch ne Kleinigkeit geändert
[edit] elende Tippfehler, nicht mein Tag heute ... [/edit]