AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Problem mit ShellMessageBox [gelöst]
Thema durchsuchen
Ansicht
Themen-Optionen

Problem mit ShellMessageBox [gelöst]

Ein Thema von MathiasSimmack · begonnen am 22. Mär 2004 · letzter Beitrag vom 23. Mär 2004
Antwort Antwort
NicoDE
(Gast)

n/a Beiträge
 
#1

Re: Problem mit ShellMessageBox

  Alt 23. Mär 2004, 08:25
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]
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:44 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz