🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.delphi
11 messages
11 total messages Started by stchebel Mon, 05 Dec 2016 13:03
Dynamiczne ładowanie DLL
#345410
Author: 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.
Re: Dynamiczne ładowanie DLL
#345419
Author: Piotr S.
Date: Mon, 05 Dec 2016 13:18
7 lines
1334 bytes
W dniu 2016-12-05 o 14:03, stchebel@gmail.com pisze:
> 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:
>
>

A gdzie użycie FreeLibrary po zakończeniu pracy programu?
Re: Dynamiczne ładowanie DLL
#345420
Author: stchebel
Date: Mon, 05 Dec 2016 13:50
10 lines
1872 bytes
W dniu poniedziałek, 5 grudnia 2016 14:18:34 UTC+1 użytkownik Piotr S. napisał:
> W dniu 2016-12-05 o 14:03, stchebel@gmail.com pisze:
> > 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:
> >
> >
> 
> A gdzie użycie FreeLibrary po zakończeniu pracy programu?

A po co? Kto powiedział, że tu jest koniec programu? Zresztą to niczego nie zmienia. Dalej tak samo.
Re: Dynamiczne ładowanie DLL
#345411
Author: immo
Date: Mon, 05 Dec 2016 14:07
14 lines
1976 bytes
W dniu poniedziałek, 5 grudnia 2016 14:03:34 UTC+1 użytkownik stch...@gmail.com napisał:

1. Sprawdzaj czy w @FT_Open_Func masz adres procki z pobrany przez GetProcAddress, np:
if Assigned(FT_Open_Func) then
  ftresult := FT_Open_Func(0,@FT_Handle)
else
  ShowMessage('FT_Open_Func not found');

2. Zadeklaruj FT_Open_Func jako FT_Open_Func(PVDevice: integer; ftHandle: Pointer): integer; stdcall;

3. Ogólnie poczytaj o podstawach :) http://delphi.about.com/od/windowsshellapi/a/delphi-dll-loading-static-dynamic.htm

pozdrawiam,
Przemek O.
Re: Dynamiczne ładowanie DLL
#345412
Author: stchebel
Date: Mon, 05 Dec 2016 14:28
17 lines
2257 bytes
W dniu poniedziałek, 5 grudnia 2016 15:07:35 UTC+1 użytkownik immo napisał:
> W dniu poniedziałek, 5 grudnia 2016 14:03:34 UTC+1 użytkownik stch...@gmail.com napisał:
> 
> 1. Sprawdzaj czy w @FT_Open_Func masz adres procki z pobrany przez GetProcAddress, np:
> if Assigned(FT_Open_Func) then
>   ftresult := FT_Open_Func(0,@FT_Handle)
> else
>   ShowMessage('FT_Open_Func not found');
> 
> 2. Zadeklaruj FT_Open_Func jako FT_Open_Func(PVDevice: integer; ftHandle: Pointer): integer; stdcall;
> 
> 3. Ogólnie poczytaj o podstawach :) http://delphi.about.com/od/windowsshellapi/a/delphi-dll-loading-static-dynamic.htm
> 
> pozdrawiam,
> Przemek O.

Wystarczyła zmiana jaką podałeś w pkt.2 . Teraz wszystko jest OK zarówno w D6 jak i Lazarusie. Jutro podejmę próby na RPi. Serdeczne dzięki.
Re: Dynamiczne ładowanie DLL
#345413
Author: konsul41
Date: Tue, 06 Dec 2016 07:17
29 lines
2476 bytes
W dniu 05-12-2016 o 15:28, stchebel@gmail.com pisze:
> W dniu poniedziałek, 5 grudnia 2016 15:07:35 UTC+1 użytkownik immo napisał:
>> W dniu poniedziałek, 5 grudnia 2016 14:03:34 UTC+1 użytkownik stch...@gmail.com napisał:
>>
>> 1. Sprawdzaj czy w @FT_Open_Func masz adres procki z pobrany przez GetProcAddress, np:
>> if Assigned(FT_Open_Func) then
>>   ftresult := FT_Open_Func(0,@FT_Handle)
>> else
>>   ShowMessage('FT_Open_Func not found');
>>
>> 2. Zadeklaruj FT_Open_Func jako FT_Open_Func(PVDevice: integer; ftHandle: Pointer): integer; stdcall;
>>
>> 3. Ogólnie poczytaj o podstawach :) http://delphi.about.com/od/windowsshellapi/a/delphi-dll-loading-static-dynamic.htm
>>
>> pozdrawiam,
>> Przemek O.
>
> Wystarczyła zmiana jaką podałeś w pkt.2 . Teraz wszystko jest OK zarówno w D6 jak i Lazarusie. Jutro podejmę próby na RPi. Serdeczne dzięki.
>
Nie nie starczyło, ponieważ nadal przy próbie wykorzystania i braku DLL 
dostaniesz Access Violation.
Musisz tak jak pokazano powyżej sprawdzać czy program załadował 
procedure/funkcje inaczej znowu będzie problem.
Dodatkowo nie sprawdzasz czy program prawidłowo załadował dll i to jest 
źródło dalszych problemów.

---
Ta wiadomość została sprawdzona na obecność wirusów przez oprogramowanie antywirusowe Avast.
https://www.avast.com/antivirus
Re: Dynamiczne ładowanie DLL
#345414
Author: stchebel
Date: Tue, 06 Dec 2016 21:33
30 lines
3032 bytes
W dniu wtorek, 6 grudnia 2016 08:17:22 UTC+1 użytkownik kons...@wp.pl napisał:
> W dniu 05-12-2016 o 15:28, stchebel@gmail.com pisze:
> > W dniu poniedziałek, 5 grudnia 2016 15:07:35 UTC+1 użytkownik immo napisał:
> >> W dniu poniedziałek, 5 grudnia 2016 14:03:34 UTC+1 użytkownik stch...@gmail.com napisał:
> >>
> >> 1. Sprawdzaj czy w @FT_Open_Func masz adres procki z pobrany przez GetProcAddress, np:
> >> if Assigned(FT_Open_Func) then
> >>   ftresult := FT_Open_Func(0,@FT_Handle)
> >> else
> >>   ShowMessage('FT_Open_Func not found');
> >>
> >> 2. Zadeklaruj FT_Open_Func jako FT_Open_Func(PVDevice: integer; ftHandle: Pointer): integer; stdcall;
> >>
> >> 3. Ogólnie poczytaj o podstawach :) http://delphi.about.com/od/windowsshellapi/a/delphi-dll-loading-static-dynamic.htm
> >>
> >> pozdrawiam,
> >> Przemek O.
> >
> > Wystarczyła zmiana jaką podałeś w pkt.2 . Teraz wszystko jest OK zarówno w D6 jak i Lazarusie. Jutro podejmę próby na RPi. Serdeczne dzięki.
> >
> Nie nie starczyło, ponieważ nadal przy próbie wykorzystania i braku DLL 
> dostaniesz Access Violation.
> Musisz tak jak pokazano powyżej sprawdzać czy program załadował 
> procedure/funkcje inaczej znowu będzie problem.
> Dodatkowo nie sprawdzasz czy program prawidłowo załadował dll i to jest 
> źródło dalszych problemów.
> 
> ---

Uwaga poniekąd słuszna, ale nie zakładam takiej sytuacji żeby wymagana DLL była nieobecna. Stąd też nie widzę potrzeby sprawdzania tego programowo.
Re: Dynamiczne ładowanie DLL
#345415
Author: konsul41
Date: Wed, 07 Dec 2016 07:28
20 lines
2231 bytes
>>> Wystarczyła zmiana jaką podałeś w pkt.2 . Teraz wszystko jest OK zarówno w D6 jak i Lazarusie. Jutro podejmę próby na RPi. Serdeczne dzięki.
>>>
>> Nie nie starczyło, ponieważ nadal przy próbie wykorzystania i braku DLL
>> dostaniesz Access Violation.
>> Musisz tak jak pokazano powyżej sprawdzać czy program załadował
>> procedure/funkcje inaczej znowu będzie problem.
>> Dodatkowo nie sprawdzasz czy program prawidłowo załadował dll i to jest
>> źródło dalszych problemów.
>>
>> ---
>
> Uwaga poniekąd słuszna, ale nie zakładam takiej sytuacji żeby wymagana DLL była nieobecna. Stąd też nie widzę potrzeby sprawdzania tego programowo.
>
Na RPi miałeś problem z brakiem dll więc jak masz zamiar wykryć że 
program nie widzi dll, przecież o to cały szum z ładowaniem dynamicznym.

---
Ta wiadomość została sprawdzona na obecność wirusów przez oprogramowanie antywirusowe Avast.
https://www.avast.com/antivirus
Re: Dynamiczne ładowanie DLL
#345416
Author: stchebel
Date: Wed, 07 Dec 2016 22:37
20 lines
2490 bytes
W dniu środa, 7 grudnia 2016 08:28:55 UTC+1 użytkownik kons...@wp.pl napisał:
> >>> Wystarczyła zmiana jaką podałeś w pkt.2 . Teraz wszystko jest OK zarówno w D6 jak i Lazarusie. Jutro podejmę próby na RPi. Serdeczne dzięki.
> >>>
> >> Nie nie starczyło, ponieważ nadal przy próbie wykorzystania i braku DLL
> >> dostaniesz Access Violation.
> >> Musisz tak jak pokazano powyżej sprawdzać czy program załadował
> >> procedure/funkcje inaczej znowu będzie problem.
> >> Dodatkowo nie sprawdzasz czy program prawidłowo załadował dll i to jest
> >> źródło dalszych problemów.
> >>
> >> ---
> >
> > Uwaga poniekąd słuszna, ale nie zakładam takiej sytuacji żeby wymagana DLL była nieobecna. Stąd też nie widzę potrzeby sprawdzania tego programowo.
> >
> Na RPi miałeś problem z brakiem dll więc jak masz zamiar wykryć że 
> program nie widzi dll, przecież o to cały szum z ładowaniem dynamicznym.
> 
> ---

Chyba mnie przekonałeś. Jutro się za to biorę i na wszelki wypadek tak zrobię.
Re: Dynamiczne ładowanie DLL
#345417
Author: mmm
Date: Fri, 09 Dec 2016 07:30
7 lines
1451 bytes
>
> Chyba mnie przekonałeś. Jutro się za to biorę i na wszelki wypadek tak zrobię.
>
Kolega che dobrze, a Ty zrobisz jak będziesz chciał.
Chodzi też o wyrabianie w sobie zdrowych nawyków :D

M
Re: Dynamiczne ładowanie DLL
#345418
Author: stchebel
Date: Fri, 09 Dec 2016 21:04
10 lines
2138 bytes
W dniu piątek, 9 grudnia 2016 08:30:05 UTC+1 użytkownik mmm napisał:
> >
> > Chyba mnie przekonałeś. Jutro się za to biorę i na wszelki wypadek tak zrobię.
> >
> Kolega che dobrze, a Ty zrobisz jak będziesz chciał.
> Chodzi też o wyrabianie w sobie zdrowych nawyków :D
> 
> M

Doceniam to i właśnie dlatego jak dalej poczytasz w tym i "siostrzanym" wątku, korzystam z tej porady.
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads