Autor |
Beitrag |
daywalker0086
Beiträge: 243
Delphi 2005 Architect
|
Verfasst: Mi 16.08.17 09:44
Hallo Leute,
ich habe ein Problem mit der Nutzung einer DLL die wohl keine richtigen Einsprungpunkte bietet.
Also von Anfang an:
ich möchte einen USB zu I2C IC von FTDI nutzen, den FT260.
Dazu gibt es eine DLL und für C++ ein paar Beispielcodes, ich nutze aber Delphi 2005.
Im Anhang findet ihr die DLL und die AN dafür.
Ich wollte jetzt einfach mal eine Funktion testen:
die als erstes auch in der Application Note genutzt wird um eine Devicelist zu erstellen.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| implementation
{$R *.dfm} function _FT260_CreateDeviceList: integer; stdcall; external 'LibFT260.dll' index 4 ; procedure TForm1.ExitClick(Sender: TObject); begin application.Terminate ; end;
procedure TForm1.Button2Click(Sender: TObject); begin showmessage(inttostr(_FT260_CreateDeviceList)); end; |
also beim klicken auf den Button2 wird mir auch ein eZahl wieder gegeben aber sobald ich die Message bestätige, bekomm ich eine Zugriffsverletzung.
Kann mir jemand sagen wie ich das richtig nutzen muss? Moderiert von Narses: Topic aus Sonstiges (Delphi) verschoben am Mi 16.08.2017 um 13:01
Einloggen, um Attachments anzusehen!
|
|
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 16.08.17 10:14
- Nachträglich durch die Entwickler-Ecke gelöscht -
Zuletzt bearbeitet von Frühlingsrolle am Mi 16.08.17 10:36, insgesamt 1-mal bearbeitet
|
|
jaenicke
Beiträge: 19302
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 16.08.17 10:26
Die Headerdatei liegt oben im Zip. Und da sieht die Funktion auch ganz anders aus als in dem Delphicode oben:
C++-Quelltext 1:
| LIBFT260_API FT260_STATUS WINAPI FT260_CreateDeviceList(LPDWORD lpdwNumDevs); |
Dass es dann knallt, ist klar...
Frühlingsrolle hat folgendes geschrieben : | Delphi-Quelltext 1:
| function FT260_CreateDeviceList(lpdwNumDevs: DWord): Integer; stdcall; | |
Ich würde sagen das müsste ein var-Parameter sein. LPDWORD ist doch ein Pointer auf ein DWORD.
// EDIT:
Und der Rückgabewert FT260_STATUS ist eine Enumeration.
|
|
daywalker0086
Beiträge: 243
Delphi 2005 Architect
|
Verfasst: Mi 16.08.17 10:51
Hallo und erstmal vielen Dank für die Antworten.
Leider tut sich noch nix bzw. erhalte immernoch die Exceptions...
Also wenn ich folgendes ändere
Delphi-Quelltext 1:
| external 'LibFT260.dll' name 'FT260_CreateDeviceList' ; |
Kommt die Meldung das der Prozedureinsprungpunkt "FT260_CreateDeviceList" nicht gefunden wurde.
Wenn ich das wieder zu index 4 ändere und meinen Buttonaufruf
zu
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| procedure TForm1.Button2Click(Sender: TObject); var devNum : dword; begin devnum:= 0; showmessage(inttostr(FT260_CreateDeviceList(DWORD(@devnum)))); end; |
ändere erhalte ich wieder eine Zahl im Dialog aber danach wieder eine Exception...
Könnt ihr nochmal schauen?
Viele Grüße Christian
|
|
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 16.08.17 11:19
- Nachträglich durch die Entwickler-Ecke gelöscht -
|
|
daywalker0086
Beiträge: 243
Delphi 2005 Architect
|
Verfasst: Mi 16.08.17 12:19
Hey Frühlingsrolle,
das wäre super wenn du das testen könntest, heute Abend ist kein Problem oder morgen...
|
|
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 16.08.17 12:45
- Nachträglich durch die Entwickler-Ecke gelöscht -
|
|
daywalker0086
Beiträge: 243
Delphi 2005 Architect
|
Verfasst: Mi 16.08.17 16:10
|
|
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 16.08.17 16:15
- Nachträglich durch die Entwickler-Ecke gelöscht -
|
|
daywalker0086
Beiträge: 243
Delphi 2005 Architect
|
Verfasst: Mi 16.08.17 16:52
---------------------------
Benachrichtigung über Debugger-Problem
---------------------------
In Projekt C:\Users\c.hohmann\Documents\Borland Studio-Projekte\Messfeld.exe trat ein Problem mit folgender Meldung auf: 'access violation at 0x74d8cb49: read of address 0x00000000'. Prozess angehalten. Mit Einzelne Anweisung oder Start fortsetzen.
---------------------------
OK
---------------------------
|
|
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 16.08.17 17:13
- Nachträglich durch die Entwickler-Ecke gelöscht -
|
|
daywalker0086
Beiträge: 243
Delphi 2005 Architect
|
Verfasst: Do 17.08.17 12:21
Hallo Frühlingsrolle,
vielen Dank für deine Bemühungen jetzt sieht es schon etwas besser aus.
Jetzt hab ich noch eine Sache, dann belästige ich euch erstmal nicht weiter.
Da ich jetzt weis wie die Funktionen handhaben muss gibts noch eine Ungereimtheit.
Es waren ja Beispielcodes mit C++ dabei, die bin ich jetzt gerade am "Übernehmen" da diese Sachen doch tatsächlich funktionieren
C++-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| int main(int argc, char const* argv[]) { FT260_HANDLE mhandle1 = INVALID_HANDLE_VALUE; FT260_STATUS ftStatus = FT260_OK; DWORD devNum = 0; FT260_CreateDeviceList(&devNum);
FT260_Open(0, &mhandle1);
unsigned char writeData[] = { 0xaa, 0xbb, 0x00, 0x01, 0x55, 0x66 };
ftStatus = FT260_I2CMaster_Init(mhandle1, 100); |
Hier geht es um die 2 Funktionen FT260_Open und Master_init.
Bei der Open Funktion wird ja ein Pointer auf das Handle übergeben.
Folgendes habe ich jetzt zusammen gebracht:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60:
| unit Testfeld;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, XPMan, StdCtrls, Buttons, ColorButton3, JDLed, d2xxunit;
function FT260_CreateDeviceList(var lpdwNumDevs: DWord): Byte; stdcall; function FT260_I2CMaster_Init(var handle: DWORD;kbps: integer): Byte; stdcall; function FT260_Open(deviceid: integer;var FT_HANDLE: DWORD): Byte; stdcall; type TForm1 = class(TForm) XPManifest1: TXPManifest; Exit: TButton; Button1: TButton; Button2: TButton; Memo1: TMemo; procedure Button2Click(Sender: TObject); procedure Button1Click(Sender: TObject); procedure ExitClick(Sender: TObject); private public
end;
var Form1: TForm1; chandle:DWORD ; implementation
{$R *.dfm}
function FT260_CreateDeviceList; external 'LibFT260.dll' name '_FT260_CreateDeviceList@4'; function FT260_I2CMaster_Init; external 'LibFT260.dll' name '_FT260_I2CMaster_Init@8'; function FT260_Open; external 'LibFT260.dll' name '_FT260_Open@8';
procedure TForm1.ExitClick(Sender: TObject); begin application.Terminate ; end;
procedure TForm1.Button2Click(Sender: TObject); var devNum : dword; i:integer; begin devnum:= 10; for i:=0 to 12 do begin FT260_Open(i,chandle); memo1.Lines.Add(IntToStr(FT260_I2CMaster_Init(chandle,100))); end; end;
end. |
Wie muss ich das in der Funktion mit dem Pointer auf dem Handle machen? Sind warscheinlich eher elementare Sachen. Der Pointer ist ja auch nur eine Zahl oder? Ist das Datentyp von chandle so machbar?
Grüße Christian
|
|
jaenicke
Beiträge: 19302
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Do 17.08.17 16:19
Delphi-Quelltext 1:
| FT260_Open(i, @chandle); |
Dass im Beispielcode der Rückgabewert nicht ausgewertet wird, ist ein wenig seltsam. Ich habe jetzt aber auch nicht geschaut was der macht.
|
|
daywalker0086
Beiträge: 243
Delphi 2005 Architect
|
Verfasst: Do 17.08.17 17:23
|
|
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Fr 18.08.17 09:51
- Nachträglich durch die Entwickler-Ecke gelöscht -
|
|
daywalker0086
Beiträge: 243
Delphi 2005 Architect
|
Verfasst: Do 24.08.17 09:25
Hallo Frühlingsrolle,
vielen vielen dank für die Arbeit mit der DLL.
Jetzt läuft es
|
|
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Do 24.08.17 09:30
- Nachträglich durch die Entwickler-Ecke gelöscht -
|
|