Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Problem mit Delphi & DLL & Pointern (https://www.delphipraxis.net/65421-problem-mit-delphi-dll-pointern.html)

iaby 16. Mär 2006 13:37


Problem mit Delphi & DLL & Pointern
 
hallo zusammen,

ich habe ein Problem und zwar will ich mit Delphi Funktionen einer .DLL-Datei nutzen. Alles soweit ja
eigentlich kein Problem, jedoch habe ich den Eindruck, dass mit der Parameterbergabe an die DLL
(insbesondere mit zu Üergebenden Pointern) etwas schief geht.
ich habe hier einmal exemplarisch das Header-File für C, was ich versucht habe, nach Delphi zu übersetzen:
Code:
...
PCIMFB2_API BOOLEAN pcimfb2InitBoards(BYTE *a_bAnzBoards);
PCIMFB2_API BOOLEAN _stdcall pcimfb2InitBoardsStdCall(BYTE *a_bAnzBoards);
...
und meine .PAS-Datei (jeweils nur Auszüge):

Delphi-Quellcode:
...
function pcimfb2InitBoards(var a_bAnzBoards: Byte): boolean; external 'PCIMFB2.dll' name 'pcimfb2InitBoards';

...

//Aufrufen der Funktion im Hauptprogramm
var Anzahl: Byte;
begin
pcimfb2InitBoards(Anzahl);
showmessage(IntToStr(Anzahl));
...
die Funtkion pcimfb2InitBoards erwartet als einzigen Parameter also einen Pointer auf ein Byte.
Wie ich hier in den Foren gelesen habe, geschieht die Üergabe als Pointer in Delphi automatisch, wenn
ich die Variable im Funktions-kopf als "var" deklariere !?
Der Funktionsaufruf an sich gelingt dann zwar auch, allerdings schreibt er mir an die Stelle, auf die
der Pointer zeigt, nichts hinein (in einem C-Beispiel funktioniert es!). Es wird also immer die Zahl
ausgegeben, die schon vor Funktionsaufruf zugewiesen war (in diesem Fall 0).

Kann mir jemand helfen? Habe ich den Code überhaupt richtig nach Delphi bersetzt? Habe mit Pointer bis
jetzt nur in C Erfahrung und bin mir deshalb sehr unsicher!

Vielen Dank schonmal für Antworten im Voraus!


Gruss,
iaby



PS:
folgender Code führte auch nicht ans Ziel:
Delphi-Quellcode:
...
function pcimfb2InitBoards(a_bAnzBoards: Pointer): boolean; external 'PCIMFB2.dll' name 'pcimfb2InitBoards';

...

//Aufrufen der Funktion im Hauptprogramm
var Anzahl: Byte;
begin
pcimfb2InitBoards(addr(Anzahl));
showmessage(IntToStr(Anzahl));
...

Luckie 16. Mär 2006 13:51

Re: Problem mit Delphi & DLL & Pointern
 
Deklarier die Funktion mal als stdcall.

Robert Marquardt 16. Mär 2006 13:52

Re: Problem mit Delphi & DLL & Pointern
 
Es muss die Funktion pcimfb2InitBoardsStdCall benutzt werden. Es ist nicht ersichtlich welche Calling Convention die andere Version hat.
Dazu gleich noch einen Trick. Der Delphi-Name und der externe Name duerfen unterschiedlich sein.
In diesem Fall ist die Konversion von "BYTE *" korrekt. In Delphi sind unterschiedliche Konversionen dafuer moeglich.
Es koennte naemlich auch der Zeiger auf das erste Byte eines Puffers sein. die Konversion waere dann "Param: PByte".
Boolean ist keine gute Konversion von BOOLEAN. ByteBool ist angemessener.

Delphi-Quellcode:
function pcimfb2InitBoards(var a_bAnzBoards: Byte): ByteBool; external 'PCIMFB2.dll' name 'pcimfb2InitBoardsStdCall';
Probier mal das sollte funktionieren.

iaby 16. Mär 2006 15:30

Re: Problem mit Delphi & DLL & Pointern
 
ich habs jetzt mal nach dem Beispiel von Robert Marquardt gemacht und dann folgenden Funktionsaufruf benutzt:
Delphi-Quellcode:
pcimfb2InitBoards(anzahl);
aber es funktioniert leider immer noch nicht. Zudem bekomme ich jetzt noch eine Access Violation in der kernel32.dll!
hab ich noch irgendwo vergessen was zu ändern? muss ich dem Funktionsprototyp vielleicht noch beibringen, "stdCall" zu verwenden?
Den Einstiegspunkt der DLL hab ich ja bereits auf "pcimfb2InitBoardsStdCall" geändert.

habt ihr vielleicht noch eine Idee für mich?

iaby 16. Mär 2006 16:12

Re: Problem mit Delphi & DLL & Pointern
 
Ok, habs herausgefunden!
vor external noch das stdcall und dann gehts.
Das habt ihr wohl beide gemeint, bin darin aber nicht so "bewandert", deshalb wars für mich nicht selbstverständlich.
habs dann in der hilfe gefunden.

Vielen Dank euch beiden für die schnelle und gute Hilfe!!

Gruss,
iaby


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:58 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