AGB  ·  Datenschutz  ·  Impressum  







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

Probleme mit Übergabe in DLL

Ein Thema von R2009 · begonnen am 11. Okt 2010 · letzter Beitrag vom 11. Okt 2010
Antwort Antwort
R2009

Registriert seit: 9. Mär 2009
Ort: Heidelberg
440 Beiträge
 
Delphi 2007 Professional
 
#1

Probleme mit Übergabe in DLL

  Alt 11. Okt 2010, 07:44
Delphi-Version: 2007
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
Rainer Unger
Mein Profil:
Studium Allgemeine Elektrotechnik TH Darmstadt
Entwicklung von Tools für die Rundsteuer und Zählertechnik.
uP's Atmel Prozessoren (ATmega16,32,88...) in C und Assembler.

Geändert von R2009 (11. Okt 2010 um 08:04 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Probleme mit Übergabe in DLL

  Alt 11. Okt 2010, 08:12
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?
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
R2009

Registriert seit: 9. Mär 2009
Ort: Heidelberg
440 Beiträge
 
Delphi 2007 Professional
 
#3

AW: Probleme mit Übergabe in DLL

  Alt 11. Okt 2010, 08:20
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
Rainer Unger
Mein Profil:
Studium Allgemeine Elektrotechnik TH Darmstadt
Entwicklung von Tools für die Rundsteuer und Zählertechnik.
uP's Atmel Prozessoren (ATmega16,32,88...) in C und Assembler.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: Probleme mit Übergabe in DLL

  Alt 11. Okt 2010, 08:24
Du übergibst aber keinen Pointer auf einen Long (so verlangt es jedenfalls die Doku)
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
R2009

Registriert seit: 9. Mär 2009
Ort: Heidelberg
440 Beiträge
 
Delphi 2007 Professional
 
#5

AW: Probleme mit Übergabe in DLL

  Alt 11. Okt 2010, 08:35
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
Rainer Unger
Mein Profil:
Studium Allgemeine Elektrotechnik TH Darmstadt
Entwicklung von Tools für die Rundsteuer und Zählertechnik.
uP's Atmel Prozessoren (ATmega16,32,88...) in C und Assembler.
  Mit Zitat antworten Zitat
R2009

Registriert seit: 9. Mär 2009
Ort: Heidelberg
440 Beiträge
 
Delphi 2007 Professional
 
#6

AW: Probleme mit Übergabe in DLL

  Alt 11. Okt 2010, 09:02
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
Rainer Unger
Mein Profil:
Studium Allgemeine Elektrotechnik TH Darmstadt
Entwicklung von Tools für die Rundsteuer und Zählertechnik.
uP's Atmel Prozessoren (ATmega16,32,88...) in C und Assembler.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.033 Beiträge
 
Delphi 12 Athens
 
#7

AW: Probleme mit Übergabe in DLL

  Alt 11. Okt 2010, 09:03
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?

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).
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (11. Okt 2010 um 09:12 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#8

AW: Probleme mit Übergabe in DLL

  Alt 11. Okt 2010, 11:34
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
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (11. Okt 2010 um 11:37 Uhr)
  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 09:48 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