Entwickler-Ecke

Dateizugriff - Problem beim Aufruf von funktionen aus einer dll


JanI - Mo 28.05.12 15:44
Titel: Problem beim Aufruf von funktionen aus einer dll
Ich möchte eine dll in Delphi benutzen bei der die Funktionsbeschreibung in VC++ existiert. Folgende Funktion bereitet mir dabei Probleme:

Folgende Funktion:

Aus der *.h-Datei

PCIDIO_API BOOL pcidioGetSummeryOfAllBoards(PCIDIO_SUMMERY *SummeryBuffer);

Es wird ein Zeiger auf einen Datenpuffer übergeben der au ein Datenarray vom Typ PCIDIO_Summery zeigt. Der Datenpuffer sollte 4 Kartenübersichten aufnehmen können.



C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
Typdef struct PCIDIO_SUMMERYSummerybuffer
{
  Pcidio_handle hPcidiohandle;
  Byte BoardIndex;
  Byte Slotnumber;
  Byte BusNumber;
  Byte BoardAdressJumper;
  Dword BoardIOAdress; 
}

Pcidio_summery       l_SummeryBuff[4];
Bool      l_bReturnValue;


Aufruf innerhalb des Programms:


C#-Quelltext
1:
L_breturnValue =  pcidioGetSummeryOfAllBoards(l_SummeryBuffer);                    



Nun in Delphi:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
Type
  PCIDIO_SUMMERYSummerybuffer = packed Record;
  Pcidio_handle     : thandle;
  BoardIndex    : byte;
  Slotnumber    : byte;
  BusNumber    : byte;
  BoardAdressJumper  : byte;
  BoardIOAdress;   : dword;
End;



Var
  Summerybuffer  : array[1..4of PCIDIO_SUMMERYSummerybuffer

Function  pcidioGetSummeryOfAllBoards():boolean;
   Stdcallexternal ‚pcidio.dll‘;


Aufruf im Programm:


Delphi-Quelltext
1:
  L_bReturnValue:=pcidiogetSummeryOfAllBoards(Summerybuffer);                    



Mein Problem ist die Deklaration der Funktion und der eigentliche Funktionsaufruf. Kann mir jemand weiterhelfen?


Moderiert von user profile iconNarses: Topic aus VCL (Visual Component Library) verschoben am Mo 28.05.2012 um 19:17


adina83 - Mo 28.05.12 17:08

Die Deklaration in Delphi hab ich wie folgt probiert:

Delphi-Quelltext
1:
2:
Function  pcidioGetSummeryOfAllBoards(var pcidio_SummerySummeryBuffer):boolean;
   Stdcallexternal ‚pcidio.dll‘;

und den Aufruf mit:


Delphi-Quelltext
1:
L_bReturnValue:=pcidiogetSummeryOfAllBoards(Summerybuffer);                    


--> Fehlermeldung: Prozedureinsprungpunkt wurde nicht gefunden.


und


Delphi-Quelltext
1:
L_bReturnValue:=pcidiogetSummeryOfAllBoards(@Summerybuffer);                    


--> Fehlermeldung: E2197 Konstantenobjekt kann nicht als var-Parameter übergeben werden


uall@ogc - Do 07.06.12 15:55

http://www.ebru.de/data/pcidio-de-um-3v5.pdf
Ist echt ne schlechte Dokumentation:
Der buffer heißt summEry die Funktion summAry, deshalb findert der das nicht. Versuchs mal so:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
type

TPCIDIO_SUMMERYSummerybuffer = packed record
  Pcidio_handle     : thandle;
  BoardIndex    : byte;
  Slotnumber    : byte;
  BusNumber    : byte;
  BoardAdressJumper  : byte;
  BoardIOAdress;   : dword;
end;

TSummerybuffer = array[0..3of TPCIDIO_SUMMERYSummerybuffer
PSummerybuffer = ^TSummeryBuffer;

var
  Summerybuffer: TSummeryBuffer;

Function  pcidioGetSummaryOfAllBoards(pcidio_SummerySummeryBuffer: PSummerybuffer): Boolean; stdcallexternal 'pcidio.dll';
L_bReturnValue:=pcidiogetSummaryOfAllBoards(@Summerybuffer);