Einzelnen Beitrag anzeigen

dust258

Registriert seit: 18. Aug 2008
62 Beiträge
 
#1

Parameterübergabe an externe DLL (Pointer, Array, u.s.w.)

  Alt 29. Sep 2010, 10:58
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.

Geändert von dust258 (30. Sep 2010 um 09:31 Uhr)
  Mit Zitat antworten Zitat