![]() |
API-Funktionen mit Parametern funktionieren bei mir nicht.
Hallo!
Ich habe eine Frage, die mir selbst dämlich vorkommt, aber ich stell' sie trotzdem. Seit kurzer Zeit möchte ich die Win32-API verwenden. Ich denk: versuchste mal Beep oder Sleep, da kannste nich viel falsch machen. Ich hab's probiert. Mehrfach. Dynamic Linking, static linking. Nichts. Es funktioniert nicht. Dann hab ich's mit Funktionen ohne Parameter versucht. Toll. Das ging: z.B. LockWorkStation. Ohne Probleme. Funktionen MIT Parameter? Fehlanzeige. Selbst auf der Konsole mit rundll32 <dll-Name>, Parameter mit Space, ohne Space, mit Komma, ohne Komma. Nichts. Ich denke ja... :gruebel: es könnte an MEINER kernel32.dll liegen. Wie kriege ich das raus? Wo lade ich eine (intakte und virenfreie) Version runter, die W2K nicht gleich durch seine eigene ersetzt? Vielen Dank im Vorraus schon. ps Ich habe viele schlaflose Nächte gehabt, weil Sleep nicht funktioniert. (Der musste sein) Hier mein bescheidener Code:
Delphi-Quellcode:
Der Returnwert von Beep ist übrigens False. Also an den Lautsprechern liegt's nicht ;-).
program Project1;
{$APPTYPE CONSOLE} uses SysUtils, Windows; function Beep(dwFreq, dwDuration : DWORD): BOOL; external 'kernel32.dll'; begin writeln(Beep(50, 100)); readln; end. |
Re: API-Funktionen mit Parametern funktionieren bei mir nich
Versuchs mal mit
Delphi-Quellcode:
hinter dem External - kram (oder davor, siehe unter mir :zwinker: )
stdcall;
|
Re: API-Funktionen mit Parametern funktionieren bei mir nich
Da fehlt der C-Parameter Hinweis.
Code:
...:cat:...
function Beep(dwFreq, dwDuration : DWORD): BOOL; [b][color=#FF0000]stdcall;[/color][/b] external 'kernel32.dll';
|
Re: API-Funktionen mit Parametern funktionieren bei mir nich
Ich werfe mal ein Stichwort in die Runde: Aufrufkonvention. Deklarier die Funktion mal als stdcall. Die Aufrufkonvtion legt fest, wie mit den Parametern umgegangen werden soll. Also in welcher Reihenfolge sie auf den Stack abgelegt werden und wer den Stack wieder aufräumt, der Caller oder die augerufene Funktion. Da du keine Aufrufkonvention angegeben hast nimmt Delphi register als Aufrufkonvention an, das heißt die Parameter werden, wenn möglich in den Registern der CPU abgelegt, was am effizientesten ist. Windows arbeitet aber mit der Aufrufkonvention stdcall.
Code:
Och manno, nur weil ich mir mal richtig Mühe gegeben habe, bin ich letzter geworden. Das Leben ist ungerecht. :(
Direktive | Parameterreihenfolge | Bereinigung | Parameterübergabe in Register
register links nach rechts Routine ja pascal links nach rechts Routine nein cdecl rechts nach links Aufrufer nein stdcall rechts nach links Routine nein safecall rechts nach links Routine nein PS: @sakura: Es ist wieder alles gut. :P |
Re: API-Funktionen mit Parametern funktionieren bei mir nich
Ich danke Euch sehr herzlich!
Es war genau die Parameter-Konvention. Erstaunlicherweise hatte ich es vorher bereits mit stdcall; probiert, jedoch hatte ich das hinter external 'kernel32.dll'; gesetzt, und der Compiler meinte, die Deklaration würde von der ursprünglichen abweichen. Nun geht's aber. Jetzt kann ich endlich wieder "schlafen" ;-). Grüße, Caps |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:01 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