AGB  ·  Datenschutz  ·  Impressum  







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

Aufruf DLL: Wie nur das Array?

Ein Thema von markus123 · begonnen am 20. Okt 2014 · letzter Beitrag vom 23. Okt 2014
 
markus123

Registriert seit: 2. Okt 2007
9 Beiträge
 
#1

Aufruf DLL: Wie nur das Array?

  Alt 20. Okt 2014, 14:59
Hallo zusammen,

ich muss hier eine DLL einbinden, was bis jetzt problemlos funktioniert hat. Folgende Gegebenheiten: Ich habe die DLL und eine API dazu. Hinzu ein funktionierendes C++ Beispiel. Dazu eine Delphi-Unit mit den StdCalls, die meiner Meinung nach aber nicht immer 100% richtig ist. Vom Hersteller fehlt leider der Support, die sind der Meinung, dass man mit C++ doch viel besser zurecht kommt...

Mein Problem: Es gibt einen Record (C++ struct). Folgende C++ und Delphi Umsetzung, die soweit an vielen Stellen problemlos funktioniert:

Code:
typedef struct { 
   long dLength;
   BYTE* dpRef;
} FAPIMem;

FAPIMem = record
   dLength: LongInt;
   dpRef: PBYTE;
end;
Nun gibt es Aufrufe, die laut Doku Funktionen mit Input Parameter: FAPIRef* - im StdCall sieht das dann so aus:

Code:
function XY(var pRef: FAPIMem): LongInt stdcall; external 'my.dll' name '_FAPIXY@4';
Wenn ich die Funktion nun ausführen will, funktioniert folgender Code auch wieder problemlos:

Code:
var
  apiMem: FAPIMem;
begin
  XY(apiMem);
end;
Und jetzt kommt das eigentliche Problem: Eine Funktion YZ mit Input FAPIMem** - FAPIMem Reference Array (beachtet den Doppelstern!). Dazu noch ein Integer-Parameter length. Das ganz sieht für mich nun so aus, als wenn ich ein Array of FApiMem übergeben soll. Die (vorgegebene) Umsetzung des Delpi StdCalls sieht nun so aus:

Code:
function YZ(var pRef: FApiMem; length: LongInt): LongInt stdcall; external 'my.dll' name '_FAPIXY@40';
Also bin ich wie folgt vorgegangen:

Code:
var
  apiMem: arry of FApiMem;
begin
  SetLength(apiMem, 2);
  // ... hier jetzt Initialisierung ...
  YZ(apiMem[0], 2);
end;
Leider kommt dann der Fehler, dass die Daten ungültig wären. Ich gehe an der Stelle davon aus, dass meine Initalisierung korrekt funktioniert, denn wenn ich anstatt YZ die Funktion XY mit einem apiMem[0] aufrufe, klappt alles.

Der (angeblich) funktionierende C++ Code lautet in etwa:

Code:
FAPIMem **reqTest;

reqTest = (FAPIMem**) malloc (sizeof(FAPIMem*)*2);
reqTest[0] = malloc(sizeof(FAPIMem));
reqTest[1] = malloc(sizeof(FAPIMem));
// -- Hier dann die Intialisierung der eigentlichen Daten
NumberOfRef = 2;
YZ(reqTest, NumberOfRef);
Ich hätte ja fast behauptet, dass meine Umsetzung in Delphi korrekt ist, oder aber dass ich bei der Datenerzeugung wirklich irgendwo daneben greife. Allerdings komme ich keinen Zentimeter weiter und würde von euch gerne wissen, was ihr denke: Ist mein Ansatz falsch oder soll ich den Fehler woanders suchen?

Vielen Dank,
Markus

PS: Die DLL heißt natürlich nicht my.dll und die Funktionen nicht XY, YZ. Allerdings darf ich die Daten hier aus Lizenzgründen nicht weitergeben. Sorry!
  Mit Zitat antworten Zitat
 


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 08:28 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 by Thomas Breitkreuz