Autor Beitrag
daywalker0086
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 231


Delphi 2005 Architect
BeitragVerfasst: Mi 16.08.17 10: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.
ausblenden 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 user profile iconNarses: Topic aus Sonstiges (Delphi) verschoben am Mi 16.08.2017 um 13:01
Einloggen, um Attachments anzusehen!
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 16.08.17 11:14 
- Nachträglich durch die Entwickler-Ecke gelöscht -


Zuletzt bearbeitet von Frühlingsrolle am Mi 16.08.17 11:36, insgesamt 1-mal bearbeitet
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 18716
Erhaltene Danke: 1624

W10 x64 (Chrome, IE11)
Delphi 10.2 Ent, Oxygene, C# (VS 2015), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 16.08.17 11:26 
Die Headerdatei liegt oben im Zip. Und da sieht die Funktion auch ganz anders aus als in dem Delphicode oben:
ausblenden C++-Quelltext
1:
LIBFT260_API FT260_STATUS WINAPI FT260_CreateDeviceList(LPDWORD lpdwNumDevs);					

Dass es dann knallt, ist klar...

user profile iconFrühlingsrolle hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden Delphi-Quelltext
1:
function FT260_CreateDeviceList(lpdwNumDevs: DWord): Integer; stdcall// bzw. FT260_STATUS als Rückgabetyp					
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 231


Delphi 2005 Architect
BeitragVerfasst: Mi 16.08.17 11: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
ausblenden 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
ausblenden 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



BeitragVerfasst: Mi 16.08.17 12:19 
- Nachträglich durch die Entwickler-Ecke gelöscht -
daywalker0086 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 231


Delphi 2005 Architect
BeitragVerfasst: Mi 16.08.17 13:19 
Hey Frühlingsrolle,
das wäre super wenn du das testen könntest, heute Abend ist kein Problem oder morgen... :D
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 16.08.17 13:45 
- Nachträglich durch die Entwickler-Ecke gelöscht -
daywalker0086 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 231


Delphi 2005 Architect
BeitragVerfasst: Mi 16.08.17 17:10 
Tut es leider nicht. :cry:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
implementation

{$R *.dfm}

function FT260_CreateDeviceList(var lpdwNumDevs: DWord):integer; external 'LibFT260.dll' name '_FT260_CreateDeviceList@4';

procedure TForm1.ExitClick(Sender: TObject);
begin
application.Terminate ;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
devNum : dword;
begin
devnum:= 0;
//D2xxunit.Get_USB_Device_List_Detail(1);
ShowMessage(IntToStr(FT260_CreateDeviceList(devnum)));
end;

end.
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 16.08.17 17:15 
- Nachträglich durch die Entwickler-Ecke gelöscht -
daywalker0086 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 231


Delphi 2005 Architect
BeitragVerfasst: Mi 16.08.17 17: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



BeitragVerfasst: Mi 16.08.17 18:13 
- Nachträglich durch die Entwickler-Ecke gelöscht -
daywalker0086 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 231


Delphi 2005 Architect
BeitragVerfasst: Do 17.08.17 13: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 :o
ausblenden 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[] = { 0xaa0xbb0x000x010x550x66 };

    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:
ausblenden volle Höhe Delphi-Quelltext
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
  { Private-Deklarationen }
  public
  { Public-Deklarationen }

  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)));
//ShowMessage(IntToStr(D2xxunit.Create_USB_Device_List));
//ShowMessage(IntToStr(FT260_CreateDeviceList(devnum)));
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 18716
Erhaltene Danke: 1624

W10 x64 (Chrome, IE11)
Delphi 10.2 Ent, Oxygene, C# (VS 2015), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 17.08.17 17:19 
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 231


Delphi 2005 Architect
BeitragVerfasst: Do 17.08.17 18:23 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden 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.


Genau da smit dem @ habe ich auch versucht. aber dann erhalte ich den Fehler Die Typen der tatsächlichen und formalen Var-Parameter müssen übereinstimmen. :oops:
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 18.08.17 10:51 
- Nachträglich durch die Entwickler-Ecke gelöscht -
daywalker0086 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 231


Delphi 2005 Architect
BeitragVerfasst: Do 24.08.17 10:25 
Hallo Frühlingsrolle,
vielen vielen dank für die Arbeit mit der DLL.
Jetzt läuft es :D :idea:
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 24.08.17 10:30 
- Nachträglich durch die Entwickler-Ecke gelöscht -