Einzelnen Beitrag anzeigen

CarlAshnikov

Registriert seit: 18. Feb 2011
Ort: Erfurt
108 Beiträge
 
Delphi XE5 Enterprise
 
#1

LabView DLL in Delphi / Datentypen

  Alt 15. Dez 2011, 07:55
Delphi-Version: 5
Hallo,

ich möchte eine mit LabView erstellte DLL-Funktion mit Delphi verwenden. Der Aufruf funktioniert jedoch nicht. Es Öffnet sich ein Fenster und mein Programm hängt mehr Diagnosemöglichkeit bietet sich hier leider nicht.

Ich gehe davon aus, dass ich die falschen Parametertypen beim Aufruf verwende. Ich habe schon eine Zeit recherchiert und auch die entsprechenden Delphi Datentypen gefunden. Außerdem habe ich gefühlte 1000 Kombinationen probiert aber keinen Erfolg gehabt. Eventuell ist auch noch ein Bug in der DLL selbst. Vielleicht kann mir jemand sagen ob ich das korrekt mache oder ob ich auf dem falschen Weg bin.

Die Funktion ist folgendermaßen definiert:
Code:
signed long RB_I16_image_save      
(
  char *FileName,           //kompletter Pfad- und Dateinamen als string
  unsigned char FileFormat, //0 oder 1
  unsigned long dimX,       //Pixelanzahl in X
  unsigned long dimY,       //Pixelanzahl in Y
  signed short *Pixels,     //Array mit den Pixelwerten
  signed long LNge          //Länge des Pixel-Arrays
);
Die DLL hat eine C-Header Datei in der folgendes steht:
Code:
int32_t __cdecl RB_I16_image_save(char FileName[],
                                  uint8_t FileFormat,
                             uint32_t dimX,
                                  uint32_t dimY,
                                  int16_t Pixels[],
                                  int32_t LNge);
Meine Delphi Funktionsdeklaration ist so:
Delphi-Quellcode:
  TRB_I16_image_save = function(FileName: PChar; FileFormat: Byte;
    DimX,DimY: LongWord; Pixels: TStream ; PixelCount: LongInt): LongInt; cdecl;
Wobei ich für die Pixels auch schon Array of SmallInt und diverse Kombinationen mit Pointern probiert habe.

Der Aufruf der Funktion passiert hier:
Delphi-Quellcode:
function TForm1.BildSpeichern(FileName: PChar; FileFormat: Byte; DimX,DimY: LongWord; Pixels: TStream; PixelCount: LongInt): LongInt;
var
  RB_I16_image_save : TRB_I16_image_save;
  Handle : THandle;
begin
  Handle := LoadLibrary(PChar(ExtractFilePath(ParamStr(0))+'\DLL\LV_AddOns.dll'));
  if Handle <> 0 then
  begin
    @RB_I16_image_save := GetProcAddress(Handle, 'RB_I16_image_save');
    if @RB_I16_image_save <> nil then
    begin
      result := RB_I16_image_save(FileName, FileFormat, DimX, DimY, Pixels, PixelCount);
    end;
  end;
end;
Bin für jede Hilfe dankbar.
Sebastian
  Mit Zitat antworten Zitat