AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

LabView DLL in Delphi / Datentypen

Ein Thema von CarlAshnikov · begonnen am 15. Dez 2011 · letzter Beitrag vom 22. Dez 2011
Antwort Antwort
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
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#2

AW: LabView DLL in Delphi / Datentypen

  Alt 15. Dez 2011, 09:45
Auf den ersten Blick würde ich sagen TStream ist nicht richtig, vielleicht geht s.Memory bei einem MemoryStream
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
CarlAshnikov

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

AW: LabView DLL in Delphi / Datentypen

  Alt 15. Dez 2011, 10:16
Das hört sich plausibel an, da der ja ein Pointer auf ein Array von 16 bit Werten haben will.
Delphi-Quellcode:
var
  Pixels: TMemoryStream
...
result := RB_I16_image_save(FileName, FileFormat, DimX, DimY, Pixels.Memory, PixelCount);
Tuts leider auch nicht. Der Stream war auch nur eine Möglichkeit die ich probiert habe. Hatte eigentlich vor ein Array of SmallInt bzw. einen Pointer darauf zu übergeben, wobei ich der Meinung war, dass Arrays an sich schon Pointer sind. Vielleicht verwechsle ich das auch mit C.

Hat denn so ein MemoryStream die gleiche Struktur wie der erwartete int16_t array?
Das schreibe ich momentan in meine Variablen:
Delphi-Quellcode:
var
  i: SmallInt;
  Name: PChar;
  Format: Byte;
  DimX,DimY: LongWord;
  Pixels: TMemoryStream;
  PixelCount: LongInt;
begin
  Name := PChar(ExtractFilePath(ParamStr(0))+'Test.png');
  Format := 0;
  Dimx := 64;
  Dimy := 64;
  PixelCount := DimX*DimY;

  Pixels := TMemoryStream.create;
  for i := 0 to PixelCount-1 do
    Pixels.Write(i,SizeOf(i));
end;
Sebastian
  Mit Zitat antworten Zitat
bernhard_LA

Registriert seit: 8. Jun 2009
Ort: Bayern
1.123 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: LabView DLL in Delphi / Datentypen

  Alt 15. Dez 2011, 10:34
ist char FileName[] ANSI oder WIDECHAR in LABVIEW C++ ?
habe ähnliche Themen zwischen Matlab und Delphi
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.541 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: LabView DLL in Delphi / Datentypen

  Alt 15. Dez 2011, 11:02
Delphi-Quellcode:
var Pixels: array of SmallInt;

SetLength(Pixels, PixelCount);
if PixelCount > 0 then
  RB_I16_image_save(FileName, FileFormat, DimX, DimY, @Pixels[0], Length(Pixels));
Das hast Du sicherlich auch schon versucht, oder?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
CarlAshnikov

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

AW: LabView DLL in Delphi / Datentypen

  Alt 15. Dez 2011, 13:50
Danke die Vorschläge, haben leider bisher nicht gefruchtet.
Ich denke da ist intern noch was nicht in Ordnung. Ich kann in die Funktion reinstecken was ich will und das Verhalten ändert sich nicht.
Sebastian
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#7

AW: LabView DLL in Delphi / Datentypen

  Alt 15. Dez 2011, 16:15
Kommt mir sehr bekannt vor!
Ich kenne noch immer nicht die Ursache (wollte das auch eigentlich hier noch mal weiterführen), aber ich habe mir neulich auch an einem DLL Call die Zähne ausgebissen.

Das einzige was half:
Umstellung von dynamisch auf statische Bindung.
Probier doch mal

Ansonsten habe ich dabei diesem Problem irgendwo ein Tool von Dr. Bob gesehen, dass aus C Headern pas interface generiert. Mir half das nicht, weil ich auch keine C Header hatte. Weiß leider grad nicht wo das liegt. Aber vielleicht bringt Dich das auch etwas weiter.
Gruß, Jo
  Mit Zitat antworten Zitat
CarlAshnikov

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

AW: LabView DLL in Delphi / Datentypen

  Alt 22. Dez 2011, 06:52
Ich habe das Problem gelöst.
Dynamische oder statische Einbindung spielte keine Rolle.
Für das Intergerarray kann man sowohl TMemoryStream.Memory als auch @PixelArray[0] übergeben. Für das CharacterArray habe ich PChar verwendet. Der Rest wie im ersten Beitrag beschrieben.

Das Problem war einfach nur, dass ich die Funktion zum Testen im OnClick eines Buttons aufgerufen hatte! Das verträgt sich nicht mit dem Debug-Fenster, das aus der DLL kommt und mein Programm hängt sich an der Stelle auf. Eine DLL ohne Fenster funktioniert auch mit Button.
Sebastian
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:49 Uhr.
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