Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Probleme mit Übergabe in DLL (https://www.delphipraxis.net/155147-probleme-mit-uebergabe-dll.html)

R2009 11. Okt 2010 06:44

Delphi-Version: 2007

Probleme mit Übergabe in DLL
 
Hi DP'ler,
ich habe ein Problem mit der Parameterübergabe in eine DLL.

Die DLL heisst FTD2XX.DLL und stammt von FTDI. Genutzt wird diese DLL zum ansprechen der USB device in einem USB seriell controller.

Nach durchforsten aller möglichen Dokumentationen komme ich einfach nicht mehr weiter.

In der Dokumentation ist die Funktion wie folgt beschrieben:

FT_STATUS FT_GetComPortNumber (FT_HANDLE ftHandle, LPLONG lplComPortNumber)

Ich habe sie folgenmdermassen implementiert:
Delphi-Quellcode:
function FT_GetComPortNumber(ftHandle:Dword; ComPortNumber:Dword):FT_Result; stdcall; External FT_DLL_Name name 'FT_GetComPortNumber';


Function GetFTComPortNumber : FT_Result;
var i:Dword;
begin
  Result := FT_GetComportNumber(FT_handle,i);            //,@SerialNumber  FT_handle
  If Result = FT_OK then FT_Comnumber := 'COM'+IntToStr(comnumber);
end;
Das i steht hier nur versuchsweise, hier soll später eine globale Variable stehen.

Was ich auch anstelle, die Funktion GetFTComPortNumber liefert mir immer die Fehlernummer 6: fehlerhafte Parameter zurück.
FT_handle hat das Format Dword und ist korrekt. Es wird auch schon für andere Funktionen genutzt!

Mach ich irgendetwas grundsätzlich falsch? Kann mir jemand helfen?

Grüsse
rainer

Sir Rufo 11. Okt 2010 07:12

AW: Probleme mit Übergabe in DLL
 
Die Funktion hat als Parameter u.a. Den Com-Port, im DLL-Aufruf wird der Wert aber nicht übergeben.

Ist das so wirklich richtig? Wie bekommt die DLL mit, welchen Port du meinst?

R2009 11. Okt 2010 07:20

AW: Probleme mit Übergabe in DLL
 
Hi Sir Rufo,

ich soll in i den Port zurück bekommen!
Ich übergebe das handle des USB adapters, übergebe in i einen Pointer auf eine datenstruktur und bekomme darin die Nummer des Com ports zurück.

Grüsse
rainer

Sir Rufo 11. Okt 2010 07:24

AW: Probleme mit Übergabe in DLL
 
Du übergibst aber keinen Pointer auf einen Long (so verlangt es jedenfalls die Doku)

R2009 11. Okt 2010 07:35

AW: Probleme mit Übergabe in DLL
 
Hi Sir Rufo,

ich hab alles mögliche ausprobiert und bin schon ganz kirre.
Wie würdest du das machen?
Hilf mir bitte einfach mit einem Stück Code weiter.(Wäre jedenfalls nett)

Grüsse
Rainer

R2009 11. Okt 2010 08:02

AW: Probleme mit Übergabe in DLL
 
Hi Sir Rufo,
ich habe die Lösung:

Delphi-Quellcode:
function FT_GetComPortNumber(ftHandle:Dword; ComPortNumber:Pchar):FT_Result; stdcall; External FT_DLL_Name name 'FT_GetComPortNumber';

Function GetFTComPortNumber : FT_Result;
var i:Dword;
begin
  Result := FT_GetComportNumber(FT_handle,@i);            //,@SerialNumber  FT_handle
  If Result = FT_OK then FT_Comnumber := 'COM'+IntToStr(i);
end;
Funktioniert jetzt. Dein Tip war Gold wert. Danke!

Grüsse
rainer

himitsu 11. Okt 2010 08:03

AW: Probleme mit Übergabe in DLL
 
Zitat:

Hilf mir bitte einfach mit einem Stück Code weiter.(Wäre jedenfalls nett)
Es wurde doch ganz klar und deutlich gesagt, wo das Problem liegt? :gruebel:

Deine Parameterdeklaration ist falsch.
> DWORD statt PDWORD
(wobei LPLONG eigenlich ein PLongInt wäre, aber egal)

Delphi-Quellcode:
function FT_GetComPortNumber(ftHandle: THandle; ComPortNumber: PLongWord): FT_Result; stdcall;
// oder
function FT_GetComPortNumber(ftHandle: THandle; var ComPortNumber: LongWord): FT_Result; stdcall;
[edit]
nja, ob das so unbedingt besser ist?

PCHAR in C++ = Zeiger auf ein CHAR (1 unsigned Byte in C++)
PCHAR in Delphi = Zeiger auf ein Char (1 Zeichen eines Strings dynamischer Größe ... ANSI(bis D2007) = 1 Byte, Unicode(ab D2009) = 2 Byte)

Es ist ja schließlich bekannt, was es für ein Typ sein soll > ein Zeiger auf DWORD/LongWord

[add]
Delphi-Quellcode:
Function GetFTComPortNumber: String;
var Port: LongWord;
  Res: FT_Result;
begin
  //Res := FT_GetComportNumber(FT_handle, Port);
  Res := FT_GetComportNumber(FT_handle, @Port);
  If Res = FT_OK then Result := 'COM' + IntToStr(Post)
  Else {Fehlermeldung oder Standardwert zurückgeben}
end;
GetFTComPortNumber diese Funktion soll also, laut ihrem Namen den COM-Port zurückliefern, macht sie aber nicht.
In deinem Fall wäre wohl ReadFTComPortNumber o.Ä. besser.

PS: Globale Variablen?
Verpack besser alles schön in eine Klasse, mit Feldern(Variablen) und Methoden(Funktionen).

Sir Rufo 11. Okt 2010 10:34

AW: Probleme mit Übergabe in DLL
 
Jo, würde ich auch als LongInt deklarieren

Und bei einem Funktionsnamen Get...Number würde ich auch immer eine Zahl vermuten.
Zumal hier ja eine Funktion der DLL gekapselt werden soll und da würde ich immer sehr stark am Original bleiben. In der Doku steht da kommt ein LongInt zurück und du lieferst einen String.
Da musst du ja schon wieder eine zusätzliche Doku erstellen, weil andere (oder du in ein paar Wochen) da auch einen LongInt vermuten.

Da liefern die doch eine D2XXUnit.pas mit passend zur DLL, aber genau diese Funktion haben die nicht implementiert.
Das soll mal einer verstehen


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:14 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