AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Problem mit Delphi & DLL & Pointern

Ein Thema von iaby · begonnen am 16. Mär 2006 · letzter Beitrag vom 16. Mär 2006
Antwort Antwort
iaby

Registriert seit: 30. Nov 2002
Ort: BW
258 Beiträge
 
#1

Problem mit Delphi & DLL & Pointern

  Alt 16. Mär 2006, 14:37
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.dllname '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.dllname 'pcimfb2InitBoards';

...

//Aufrufen der Funktion im Hauptprogramm
var Anzahl: Byte;
begin
pcimfb2InitBoards(addr(Anzahl));
showmessage(IntToStr(Anzahl));
...
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Problem mit Delphi & DLL & Pointern

  Alt 16. Mär 2006, 14:51
Deklarier die Funktion mal als stdcall.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#3

Re: Problem mit Delphi & DLL & Pointern

  Alt 16. Mär 2006, 14:52
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.

function pcimfb2InitBoards(var a_bAnzBoards: Byte): ByteBool; external 'PCIMFB2.dllname 'pcimfb2InitBoardsStdCall'; Probier mal das sollte funktionieren.
  Mit Zitat antworten Zitat
iaby

Registriert seit: 30. Nov 2002
Ort: BW
258 Beiträge
 
#4

Re: Problem mit Delphi & DLL & Pointern

  Alt 16. Mär 2006, 16:30
ich habs jetzt mal nach dem Beispiel von Robert Marquardt gemacht und dann folgenden Funktionsaufruf benutzt:
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?
  Mit Zitat antworten Zitat
iaby

Registriert seit: 30. Nov 2002
Ort: BW
258 Beiträge
 
#5

Re: Problem mit Delphi & DLL & Pointern

  Alt 16. Mär 2006, 17:12
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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:38 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