![]() |
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:
und meine .PAS-Datei (jeweils nur Auszüge):
...
PCIMFB2_API BOOLEAN pcimfb2InitBoards(BYTE *a_bAnzBoards); PCIMFB2_API BOOLEAN _stdcall pcimfb2InitBoardsStdCall(BYTE *a_bAnzBoards); ...
Delphi-Quellcode:
die Funtkion pcimfb2InitBoards erwartet als einzigen Parameter also einen Pointer auf ein Byte.
...
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)); ... 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)); ... |
Re: Problem mit Delphi & DLL & Pointern
Deklarier die Funktion mal als stdcall.
|
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:
Probier mal das sollte funktionieren.
function pcimfb2InitBoards(var a_bAnzBoards: Byte): ByteBool; external 'PCIMFB2.dll' name 'pcimfb2InitBoardsStdCall';
|
Re: Problem mit Delphi & DLL & Pointern
ich habs jetzt mal nach dem Beispiel von Robert Marquardt gemacht und dann folgenden Funktionsaufruf benutzt:
Delphi-Quellcode:
aber es funktioniert leider immer noch nicht. Zudem bekomme ich jetzt noch eine Access Violation in der kernel32.dll!
pcimfb2InitBoards(anzahl);
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? |
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 12:22 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