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:
struct Document //verkleinerte Version
{
public int version;
public string FileName;
public IntPtr data;
public int dataLen;
}
Also in Delphi:
Delphi-Quellcode:
type
TDocument = packed record
version : Integer;
FileName : PChar;
data : Pointer;
dataLen : Integer;
end;
Mit "data" wird ein Pointer auf ByteArray (Byte[]), das die zu bearbeitende Datei enthält, übergeben.
Code:
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;
Mein Typ um ein Byte[] zu simulieren:
Delphi-Quellcode:
type
TArrayOfByte = Array of Byte;
PArrayOfByte = ^TArrayOfByte;
Und der Aufruf
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:
SecSignerAdapter.signMulti failed: java.lang.NullPointerException: DataToSign not defined
at seccommerce.secsignersigg.lo.a(Unknown Source)
at seccommerce.secsignersigg.lp.a(Unknown Source)
at seccommerce.secsignersigg.lh.a(Unknown Source)
at seccommerce.secsignersigg.SecSigner.sign(Unknown Source)
at seccommerce.secsigner.ext.SecSignerAdapter.signMul ti(Unknown Source)
Seht Ihr was ich da falsch mache? Wenn ich einen Haltepunkt auf PBArrContentBuffer sind die gleichen Daten vorhanden wie im c# Programm
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.