![]() |
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:
Das i steht hier nur versuchsweise, hier soll später eine globale Variable stehen.
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; 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 |
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? |
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 |
AW: Probleme mit Übergabe in DLL
Du übergibst aber keinen Pointer auf einen Long (so verlangt es jedenfalls die Doku)
|
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 |
AW: Probleme mit Übergabe in DLL
Hi Sir Rufo,
ich habe die Lösung:
Delphi-Quellcode:
Funktioniert jetzt. Dein Tip war Gold wert. Danke!
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; Grüsse rainer |
AW: Probleme mit Übergabe in DLL
Zitat:
Deine Parameterdeklaration ist falsch. > DWORD statt PDWORD (wobei LPLONG eigenlich ein PLongInt wäre, aber egal)
Delphi-Quellcode:
[edit]
function FT_GetComPortNumber(ftHandle: THandle; ComPortNumber: PLongWord): FT_Result; stdcall;
// oder function FT_GetComPortNumber(ftHandle: THandle; var ComPortNumber: LongWord): FT_Result; stdcall; 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:
GetFTComPortNumber diese Funktion soll also, laut ihrem Namen den COM-Port zurückliefern, macht sie aber nicht.
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; 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). |
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 12:41 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz