🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.delphi
Article #345410

Dynamiczne ładowanie DLL

#345410
From: stchebel
Date: Mon, 05 Dec 2016 13:03
62 lines
3251 bytes
Witam,
Temat jest w zasadzie kontynuacją innego wątka(Raspberry/Lazarus/FTDI), ale żeby zbytnio nie mieszać postanowiłem problem opisać w odrębnym wątku. Otóż zgodnie z Waszymi sugestiami pojąłem próbę dynamicznego ładowania dll'ki FTDI. Na formie jest położony Button i Label. Cały kod wygląda tak:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls, D2XXUnit;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Label1: TLabel;
 
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  FT_HANDLE:DWord=0;
  ftresult:integer;
  DLL_Handle:THandle;
  FT_Open_Func:function(PVDevice:Integer; ftHandle:Pointer):integer;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
DLL_Handle:=LoadLibrary('ftd2xx.dll');
@FT_Open_Func:=GetProcAddress(DLL_Handle,'FT_Open');
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
ftresult:=FT_Open_Func(0,@FT_HANDLE);
Label1.Caption:=IntToStr(ftresult);
end;

end.

No i teraz tak (zarówno D6 jak i Lazarus):

1) Po Button1Click wyskakuje błąd(D6):"Project1.exe faulted with message:'access violation at 0x000312d5: write of address 0x10c00000'.Process stopped.Use Step or Run to continue"

2) Jeżeli "zakomentarzuję" w Button1Click tylko wywołanie funkcji FT_Open_Func, to jest OK, wartość Label1 zmienia się na '0'.

3) Jeżeli "zakomentarzuję" w Button1Click tylko Label1.Caption....., to też jest OK, ale oczywiście Label1.Caption pozostaje bez zmian.

4) Zamiast Label1, położyłem na formie TrackBar i robiłem experyment TrackBar1.Position:=IntToStr(ftresult). Wówczas program normalnie przechodzi.

5) Inna sprawa, że wykonanie funkcji FT_Open jest błędne. Przy podłączonym urządzeniu FTDI do komputera, powinno mi zwrócić wartość 0, tymczasem zwraca 2.

Co robię źle? Bardzo proszę o wskazówki.
Technical Details
Message-ID: <d4e0b6e4-835d-4acd-b39f-9badaa7abbc1@googlegroups.com>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!agh.edu.pl!news.agh.edu.pl!newsfeed2.atman.pl!newsfeed.atman.pl!news.nask.pl!news.nask.org.pl!news.unit0.net!news.glorb.com!n6no2785624qtd.0!news-out.google.com!j8ni5137qtc.0!nntp.google.com!n6no2785620qtd.0!postnews.google.com!glegroupsg2000goo.googlegroups.com!not-for-mail

Show Full Headers
Complete Article Headers
X-Received: by 10.99.158.26 with SMTP id s26mr27711380pgd.52.1480943013551;        Mon, 05 Dec 2016 05:03:33 -0800 (PST)
X-Received: by 10.157.39.129 with SMTP id c1mr3638288otb.15.1480943013473; Mon, 05 Dec 2016 05:03:33 -0800 (PST)
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!agh.edu.pl!news.agh.edu.pl!newsfeed2.atman.pl!newsfeed.atman.pl!news.nask.pl!news.nask.org.pl!news.unit0.net!news.glorb.com!n6no2785624qtd.0!news-out.google.com!j8ni5137qtc.0!nntp.google.com!n6no2785620qtd.0!postnews.google.com!glegroupsg2000goo.googlegroups.com!not-for-mail
Newsgroups: pl.comp.lang.delphi
Date: Mon, 5 Dec 2016 05:03:33 -0800 (PST)
Complaints-To: groups-abuse@google.com
Injection-Info: glegroupsg2000goo.googlegroups.com; posting-host=185.53.155.198; posting-account=67yd9woAAAAHUu8VHyA7Js47M98NE3m3
NNTP-Posting-Host: 185.53.155.198
User-Agent: G2/1.0
MIME-Version: 1.0
Message-ID: <d4e0b6e4-835d-4acd-b39f-9badaa7abbc1@googlegroups.com>
Subject: Dynamiczne ładowanie DLL
From: stchebel@gmail.com
Injection-Date: Mon, 05 Dec 2016 13:03:33 +0000
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit