![]() |
Parameterübergabe an externe DLL (Pointer, Array, u.s.w.)
Hallo Leute,
seit ein paar Tagen versuche ich eine Externe DLL in mein Programm einzubinden. Der Quellcode der Dll liegt zwar nicht vor, dafür aber Programmierbeispiele in C# und c. Die DLL wandelt die Daten um und gibt sie dann an eine Java-Applikation weiter. Das Einbinden hat auch schon ganz gut funktioniert, nur die Parameterübergabe macht mir noch einige Probleme... Es wird ein ein Array der Struktur "Document" erwartet ;
Code:
Also in Delphi:
struct Document //verkleinerte Version
{ public int version; public string FileName; public IntPtr data; public int dataLen; }
Delphi-Quellcode:
Mit "data" wird ein Pointer auf ByteArray (Byte[]), das die zu bearbeitende Datei enthält, übergeben.
type
TDocument = packed record version : Integer; FileName : PChar; data : Pointer; dataLen : Integer; end;
Code:
Mein Typ um ein Byte[] zu simulieren:
FileStream fileStream = new FileStream("c:/test.pdf", FileMode.Open, FileAccess.Read);
BinaryReader fileReader = new BinaryReader(fileStream); byte[] contentBuffer = fileReader.ReadBytes(1500000); fileReader.Close(); IntPtr contentCBuffer = Marshal.AllocHGlobal(contentBuffer.Length); Marshal.Copy(contentBuffer, 0, contentCBuffer, contentBuffer.Length); documents[i].version = 6; documents[i].documentFileName = "test.pdf"; documents[i].dataToBeSigned = contentCBuffer; documents[i].dataToBeSignedLen = contentBuffer.Length;
Delphi-Quellcode:
Und der Aufruf
type
TArrayOfByte = Array of Byte; PArrayOfByte = ^TArrayOfByte;
Delphi-Quellcode:
var
len : Integer; FileStream : TFileStream; BArrcontentBuffer : TArrayOfByte; PBArrContentBuffer : PArrayOfByte; begin documents[i].version := 6; documents[i].FileName := PCHar('test.pdf'); FileStream := TFileStream.Create('c:\test.pdf', fmOpenRead); try len := FileStream.Size; SetLength(BArrcontentBuffer, len); FileStream.ReadBuffer(Pointer(BArrcontentBuffer)^, len); PBArrContentBuffer := @BArrcontentBuffer; finally FileStream.Free; end; documents[i].dataToBeSigned := PBArrContentBuffer; //wenn ich hier einen Haltepunkt setzt enthält PBArrContentBuffer die gleichen Daten wie in meinem C# Beispielprogramm documents[i].dataToBeSignedLen := len; end; Meine Frage: Die Dll liefert mir im Moment folgende Fehlermeldung (über eine Funktion GetLastErrorMessage): Zitat:
Das ist das 1. mal das ich mit einer dll in Delphi arbeite. Ich hoffe da kann mir Jemand helfen. Danke für die Mühe ^^ PS: Tipps, Anmerkungen, Fragen? Immer her damit. |
AW: Parameterübergabe an externe DLL (Pointer, Array, u.s.w.)
Ich habe die Frage noch einmal zusammengefasst. Ich hoffe jetzt ist es ein wenig leichter zu lesen...
|
AW: Parameterübergabe an externe DLL (Pointer, Array, u.s.w.)
Ich habe jetzt auch den in C geschriebenen Beispielcode zum laufen bekommen. Seht Ihr eine Möglichkeit (unsigned char*)malloc in Delphi nachzustellen?
Struktur aus der Header-Datei:
Code:
Pointer sign()
typedef struct
{ int version; char* documentFileName; unsigned char* dataToBeSigned; int dataToBeSignedLen; }
Code:
Und der Aufruf:
SIGN = (SIGN_TYPE) GetProcAddress(hMod, "SecSigner_Sign");
int signDocs(DOCUMENT documents[], int documentCount, BYTEARRAY cipherCerts[], int cipherCertCount, BYTEARRAY softKeyData[], int softKeyDataCount) { int ret = (*SIGN)(documents, documentCount, cipherCerts, cipherCertCount, softKeyData, softKeyDataCount); return ret; }
Code:
EDIT: Die DLL wurde übrigens in C++ geschrieben.
contentBuffer = (unsigned char*)malloc(CONTENT_BUF_LEN);
filePos = 0; while (true) { int bytesRead = _read(fd, &contentBuffer[filePos], CONTENT_BUF_LEN-filePos); if (bytesRead < 0) { return -1; } if (bytesRead == 0) { break; } filePos+=bytesRead; } documents[i].version = 7; documents[i].documentFileName = "test.pdf"; documents[i].dataToBeSigned = contentBuffer; documents[i].dataToBeSignedLen = filePos; |
AW: Parameterübergabe an externe DLL (Pointer, Array, u.s.w.)
Wenn ich mich nicht irre müsste unsigned char* das selbe wie ein PChar sein. Du könntest also mit SetLength() ein dynamisches array of Char alloziieren und @Array[0] als Pointer für das Struct benutzen. Dann aber beim reinkopieren der Daten (das Strings) an die Nullterminierung denken.
|
AW: Parameterübergabe an externe DLL (Pointer, Array, u.s.w.)
Danke, das klingt plausibel, funktioniert aber leider nicht (gleiche Fehlermeldung aus der dll) ^^
Ich denke das mir einfach die nötigen debugging-Informationen fehlen (wie gesagt, das Record ist eine gekürzte Version). Ich werden mir wohl was anderes einfallen lassen. |
AW: Parameterübergabe an externe DLL (Pointer, Array, u.s.w.)
Zitat:
An den Fragesteller kann man nur bemerken, daß er nicht einfach die wichtigsten Teile in seiner Frage weglassen sollte, wenn er eine Antwort erwartet. Ich habe mehrfach drübergelesen und noch immer nicht Zitat:
|
AW: Parameterübergabe an externe DLL (Pointer, Array, u.s.w.)
Zitat:
ein P(Ansi)Char wäre "char*" |
AW: Parameterübergabe an externe DLL (Pointer, Array, u.s.w.)
Hallo dust,
gab es eine Lösung - sitze nun Jahre später an dem gleichen Problem, secsigner_sign - stets mit Statuscode -3! mfg Uwe |
AW: Parameterübergabe an externe DLL (Pointer, Array, u.s.w.)
Sollte im Prinzip so funktionieren:
Delphi-Quellcode:
Von den Arrays wird nur immer die Adresse des ersten Elements übergeben.
type
PDocument = ^TDocument; TDocument = packed record Version: Integer; FileName: PAnsiChar; Data: Pointer; DataLen: Integer; end; function Sign(Document: PDocument; DocumentCount: Integer; cipherCerts: Pointer; cipherCertCount: Integer; softKeyData: Pointer; softKeyDataCount: Integer): Integer; Zu TDocument: - Für Data kann man direkt die Adresse und Größe des Puffers eines MemmoryStream verwenden. - Filename muss irgendwo als AnsiString zwischengespeichert werden, solange TDocument in Verwendung ist (damit der Zeiger gültig bleibt). Sollte es dann immer noch Fehler geben, vollständigen Quellcode der Umsetzung mit Deklarationen bitte. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:01 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