Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   String array als Parameter für externe DLL? (https://www.delphipraxis.net/153261-string-array-als-parameter-fuer-externe-dll.html)

pantarhei 27. Jul 2010 11:31

String array als Parameter für externe DLL?
 
Mal wieder eine Problem bzgl. Übergabeparameter für eine externe DLL Funktion. Meine externe Funktion sieht folgendermassen aus:
Code:
extern "C" __declspec(dllexport) int __cdecl Identify(BSTR* bstrTemplates, __int64 lCount, __int64* lIndex, __int64* lRetCode)
BSTR* bstrTemplates soll ein string array sein, und lcount die Anzahl in dem übergebenen array. Wie ist obige Funktion in D7 zu deklarieren, und wie übergebe ich ein array of string an diese Funktion?

blackfin 27. Jul 2010 12:47

AW: String array als Parameter für externe DLL?
 
BSTR* ist ein Pointer auf ein C-string-Array.
(Ein Sternchen beim Typ ist ein Pointer auf den Typ in C, ein Sternchen bei der Variable selbst würde dem "var" Statement von Delphi entsprechen)
Normalerweise übergibt man die Argumente einer C-DLL über ein array of PChar:

Delphi-Quellcode:
var
  ArgCount: Integer ;
  Arg : array of PChar;
  PArg : ^PChar;
begin  
   SetLength(Arg,2);
   Arg[0]:= xxx // Param 1
   Arg[1]:= xxx // Param 2
   ArgCount := High(Arg)+1 ; // Anzahl der Parameter steht in ArgCount
   PArg:=@Arg[0]; // PArg übergibst du dann an die Funktion  
end;
Wenn ich keine Fehler gemacht habe (unwahrscheinlich :)), müsste sich die Header-Funktion so übersetzen lassen:

Delphi-Quellcode:
function Identify(bstrTemplates : ^PChar; lCount: Int64; lIndex: Int64; lRetCode: Int64): Integer; cdecl; external '<Dateiname der DLL>';

...korrigiert mich, ich bin kein C-Tier :D

pantarhei 27. Jul 2010 13:10

AW: String array als Parameter für externe DLL?
 
Erstmal Danke für den Tip. Also bei der Deklaration wird schonmal ^PChar angemeckert.

=> Identifier expected but '^' found.

Wenn ich anstelle ^PChar nur Pointer verwende, läuft es zwar erzeugt aber eine Access Violation wenn ich den Rest des Codes so benutze. Ich blicke es gerade gar nicht. :(

blackfin 27. Jul 2010 13:19

AW: String array als Parameter für externe DLL?
 
Das mit dem Identifier expected liegt daran, dass der compiler den Pointer so nicht mag, deklariere einfach einen Typ vorher:

Delphi-Quellcode:
type
  PPChar = ^PChar ;
...
..
.
function Identify(bstrTemplates : PPChar; lCount: Int64; lIndex: Int64; lRetCode: Int64): Integer; cdecl; external '<Dateiname der DLL>';

DeddyH 27. Jul 2010 13:30

AW: String array als Parameter für externe DLL?
 
Zitat:

Delphi-Quellcode:
ArgCount := High(Arg)+1 ;

Wäre
Delphi-Quellcode:
ArgCount := Length(Arg);
nicht die sicherere Alternative? Klar, bei dynamischen Arrays kommt das auf das Selbe heraus, trotzdem gefällt mir das so besser.

pantarhei 27. Jul 2010 13:35

AW: String array als Parameter für externe DLL?
 
Erzeugt leider wie die meisten anderen Versuche auch eine Access Violation. Wenn ich das Ganze mit einem array of WideString durchspiele gibt es wenigstens keine AV. Aber die Funktion macht dann auch nichts.

blackfin 27. Jul 2010 13:52

AW: String array als Parameter für externe DLL?
 
Wie hast du es denn nun genau deklariert und wie / wo rufst du die Funktion auf?
Eine AV kann vieles sein :D
Woher kommt die DLL überhaupt? Das ist aber keine COM-Dll?

pantarhei 27. Jul 2010 14:18

AW: String array als Parameter für externe DLL?
 
[EDIT]
Ist keine COM-Dll. Ist eine DLL zum ansteuern eines Venescanners.
[/EDIT]

Type
Delphi-Quellcode:
type
  PPchar = ^PChar;
DLL
Delphi-Quellcode:
function Identify(ATemplates: PPChar; ATemplatesCount: Cardinal; var ATemplateIndex: Cardinal; var ARetCode: Cardinal): Integer; cdecl; external 'Identify.dll';
Aufruf
Delphi-Quellcode:
var
  scanIndex, retCode: Cardinal;
  Args: array of PChar;
  PArg: PPChar;
  ArgCount: Cardinal;
begin
  SetLength(Args, 2);
  Args[0] := 'template1';
  Args[1] := 'template2';
  PArg := @Args[0];
  ArgCount := High(Args) + 1;

  Identify(PArg, ArgCount, scanIndex, retCode);
end;
Ergibt dann eine EAccessViolation

=> Acces violation at address 7C80A300 in module 'kernel32.dll'. Read of adress...

Wenn ich jetzt anstelle des von dir vorgeschlagenen ^PChar in der Deklaration einen PWideChar verwende und anstelle eines array of PChar ein array of WideChar verwende kommt es beim Aufruf wenigstens nicht mehr zu einer AV. Allerdings macht die Funktion auch nicht dass was sie soll. ;)

So langsam aber sicher blick ich gar nicht mehr durch.

gammatester 27. Jul 2010 14:31

AW: String array als Parameter für externe DLL?
 
Auf jeden Fall solltest Du auch Int64 anstelle der Cardinal verwenden.

pantarhei 27. Jul 2010 14:52

AW: String array als Parameter für externe DLL?
 
Zitat:

Zitat von gammatester (Beitrag 1037898)
Auf jeden Fall solltest Du auch Int64 anstelle der Cardinal verwenden.

Warum aufjedenfall? Zumindest bei einam anderen Aufruf aus der gleichen DLL tuts der Cardinal aufjedenfall. Evtl. eine kleiner Erläuterung deinerseits warum Int64 verwendet werden sollte?


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:51 Uhr.
Seite 1 von 2  1 2      

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