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, 06: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 07: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, 07: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, 07: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, 07: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, 07: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, 08: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.341 Beiträge
 
Delphi 12 Athens
 
#7

AW: Probleme mit Übergabe in DLL

  Alt 11. Okt 2010, 08: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).
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (11. Okt 2010 um 08:12 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 14:45 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