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 External exception C000001E beim Aufruf einer DLL-Funktion! (https://www.delphipraxis.net/119189-external-exception-c000001e-beim-aufruf-einer-dll-funktion.html)

Hedge 21. Aug 2008 19:29


External exception C000001E beim Aufruf einer DLL-Funktion!
 
Habe eine Funktion einer DLL statisch geladen:

Delphi-Quellcode:
...
var
  Form1: TForm1;
  function SetLCDLight(value: integer): bool;
  external 'lglight.dll';

implementation
...
Die Definition des Author sieht so aus:

Zitat:

Here is the API dll, usable by all programmin languages, which has following functions:

BOOL SetLCDLight(IN INT value);
--- value: 0=off 1=half 2=full
Wenn ich jetzt zB in nem Button SetLCDLight(2); verwende kommt nach Drücken des Buttons folgende Fehlermeldung:
"Externe Exception C000001E"

Wo liegt mein Fehler?

mkinzler 21. Aug 2008 19:38

Re: External exception C000001E beim Aufruf einer DLL-Funkti
 
Versuch es mal mit
Delphi-Quellcode:
cdecl;
oder
Delphi-Quellcode:
stdcall;

Hedge 21. Aug 2008 20:20

Re: External exception C000001E beim Aufruf einer DLL-Funkti
 
Super, funktioniert!

Was bringt das stdcall; eigentlich?

Bernhard Geyer 21. Aug 2008 20:23

Re: External exception C000001E beim Aufruf einer DLL-Funkti
 
Wikipedia liefert hier einiges, aber auch die Onlinehilfe von Delphi müsste eine Erklärung haben.

Apollonius 21. Aug 2008 20:25

Re: External exception C000001E beim Aufruf einer DLL-Funkti
 
Es legt die sogenannte Aufrufkonvention fest. Die Aufrufkonvention sagt u.A., wie die Funktion ihre Parameter erwartet - auf dem Stack oder in Registern - und in welcher Reihenfolge. Die DLL-Funktion hat offensichtlich die Aufrufkonvention stdcall, erwartet ihren Parameter also auf dem Stack. Du hast jedoch keine Aufrufkonvention angegeben, dadurch hat Delphi angenommen, dass es sich um die Delphi-eigene Konvention Register handelt. Das bedeutet, dass die ersten drei Parameter in Registern übergeben werden. Du hast der Funktion ihren Parameter also in einem Register gegeben, die Funktion hat aber auf dem Stack nachgeschaut. Dass das nicht klappen kann, sollte klar sein.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:22 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz