Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi API-Funktionen mit Parametern funktionieren bei mir nicht. (https://www.delphipraxis.net/66043-api-funktionen-mit-parametern-funktionieren-bei-mir-nicht.html)

Caps 23. Mär 2006 22:31


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:
program Project1;
{$APPTYPE CONSOLE}
uses
  SysUtils, Windows;

function Beep(dwFreq, dwDuration : DWORD): BOOL; external 'kernel32.dll';

begin
 writeln(Beep(50, 100));
 readln;
end.
Der Returnwert von Beep ist übrigens False. Also an den Lautsprechern liegt's nicht ;-).

Daniel G 23. Mär 2006 22:40

Re: API-Funktionen mit Parametern funktionieren bei mir nich
 
Versuchs mal mit

Delphi-Quellcode:
stdcall;
hinter dem External - kram (oder davor, siehe unter mir :zwinker: )

sakura 23. Mär 2006 22:42

Re: API-Funktionen mit Parametern funktionieren bei mir nich
 
Da fehlt der C-Parameter Hinweis.
Code:
function Beep(dwFreq, dwDuration : DWORD): BOOL; [b][color=#FF0000]stdcall;[/color][/b] external 'kernel32.dll';
...:cat:...

Luckie 23. Mär 2006 22:50

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:
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
Och manno, nur weil ich mir mal richtig Mühe gegeben habe, bin ich letzter geworden. Das Leben ist ungerecht. :(

PS:
@sakura: Es ist wieder alles gut. :P

Caps 24. Mär 2006 02:08

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