[Delphi] Biblioteka DLL współpracująca z programem.

0

Cześć!
Mam zamiar zrobić coś takiego:

  • w DLL-u przypiszę do identyfikatora "B1" zadanie: label1.caption:= 'ok';
  • do identyfikatora "B2" przypiszę: ShowMessage('ok');

Ten label jest w programie obsługującym dll-a a komunikat ma się wyświetlić na ekranie. Chciałbym, aby te czynności zostały wykonane, gdy WYWOŁAM Z PROGRAMU OBSŁUGUJĄCEGO DANY IDENTYFIKATOR który jest w dll-u...i tu tkwi mój problem: jak zrobić taką komunikację programu z dll-em? jak przypisać w dll-u zadanie do zmiennej i po jej WYWOŁANIU z programu obsługującego - wykonać to zadanie w programie obsługującym?
Może trochę zamotałem :-) Jeśli ktoś nie rozumie to mówcie to naświetlę problem staranniej (teraz nie mam niestety czasu i...):-)
Pomocy...jak to zrobić?? Za pomoc z góry dziękuję :-)--Pracuję w Delphi
+---------------------------+
Pozdrawiam
GG: 4079188
[email protected]

0

Z tego co zrozumiełem to chcesz żeby biblioteka DLL jednocześnie wyświetliła okienko ShowMessage i zmieniła napis w programie ją wywołującym, a problemem jest to, że nie wiesz jak się do tego labela odwołać?

Jeżeli tak jest to przekaż wskaźnik do labela w procedurze, którą wywołujesz w DLL

PLabel = ^TLabel
procedure WyświetlOK(Label : PLabel);

Jakbyś miał problemy to przeanalizuj programy przykładowe dotyczące wątków (to działa na tej samej zasadzie).

Jeżeli to nie o to ci chodziło to tłumacz.--Jest jeszcze jeden błąd ... :)

Apel: Piszcie w tematach o jaki język programowania chodzi np. : [Delphi], [C++], itp.

Pomoc do Delphi po polsku. http://www.4programmers.net/forum/index.php?action=show&id=21335&c=2

Oficjalny kanał IRC serwisu 4programers:
serwer: warszawa.ircnet.pl sieć: POLNet kanał: #4programmers.net

0

Dryobates napisał:

&gtJeżeli tak jest to przekaż wskaźnik do labela w procedurze, którą wywołujesz w DLL
&gt
&gtPLabel = ^TLabel
&gtprocedure WyświetlOK(Label : PLabel);
&gt

A u mnie dziala tak:

program:

type
TB1=procedure(X:TLabel); stdcall;
var
Form1: TForm1;
DLLInstance: THandle;
B1: TB1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
DLLInstance:=LoadLibrary('Project2.dll');
If DLLInstance=0 then
begin
Label1.Caption:='DLL not loaded';
end
else
@B1:=GetProcAddress(DllInstance,'B1');
if @B1=nil then
Label1.Caption:='Procedure not found';
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
if @b1&lt&gtnil then
B1(Label1);
end;

dll:
uses
SysUtils,
Classes,
StdCtrls;

{$R *.res}
procedure B1(X:TLabel); stdcall;
begin
X.Caption:='OK';
end;

exports
B1;

begin
end.--Pawel {Delphi 6 Personal}

Po pierwsze: naciśnij F1

0

pq napisał:
A u mnie dziala tak:

procedure B1(X:TLabel); stdcall;
begin
X.Caption:='OK';
end;

Nie twierdzę, że to nie będzie działać, ale zużycie pamięci jest większe i działa to troszkę wolniej (pół biedy jak takie coś jest wywoływane tylko kilka razy. W jedny ze swoich programów przekazywałem całe obiekty kilkadziesiąt razy na sekundę. Działało w żółwim tempie...).
Oprócz tego, że program ma działać, dobrze by było, żeby był optymalizowany pod kątem wydajności i zużycia pamięci (choć w wypadku TLabel chyba można sobie odpóścić. To i tak mały obiekt, a kompilator możliwe, że zamieni to sam)--Jest jeszcze jeden błąd ... :)

Apel: Piszcie w tematach o jaki język programowania chodzi np. : [Delphi], [C++], itp.

Pomoc do Delphi po polsku. http://www.4programmers.net/forum/index.php?action=show&id=21335&c=2

Oficjalny kanał IRC serwisu 4programers:
serwer: warszawa.ircnet.pl sieć: POLNet kanał: #4programmers.net

0

Dryobates napisał:
&gtOprócz tego, że program ma działać, dobrze by było, żeby był optymalizowany pod kątem wydajności i zużycia

Jak najbardziej popieram. Ale mam pewna watpliwosc, otoz wydaje mi sie (moze nie mam racji), ze w delphi obiekty sa same z siebie wskaznikami. I mojej wersji tak naprawde tez przekazywany jest wskaznik.

Moje przypuszczenia potwierdza wynik nastepujacego kodu:
Label1.Caption:=IntToStr(SizeOf(TLabel));

Ale jesli nie mam racji, to prosze o oswiecenie.

--Pawel {Delphi 6 Personal}

Po pierwsze: naciśnij F1

0

Dziękuję za odpowiedzi...

do pq: załóż sobie GG to będziemy mogli wydajniej i szybciej rozmawiać. Oprócz ICQ możesz mieć właśnie GG - używane przez większość osób :-)

Na pierwszy rzut oka wydaje mi się że pq mnie zrozumiał. NIE chciałem wywołać JEDNOCZEŚNIE zmiany label'a oraz MessageBox-a tylko tak:

w dll-u zmienna B1 posiada zadanie label1.caption:= 'ok'; a zmienna B2 posiada
ShowMessage('W porządku');

aby wykonać jedno z tych zadań MUSZĘ wywołać z poziomu programu dany identyfikator (B1 lub B2) i w zależności od tego, który identyfikator wybiorę - takie zadanie się wykona.

Problemy:

  • nie wiem jak w dll-u zdefiniować zadania do wykonania bo on nie widzi tego label1...
    nie uznaje też ShowMessage :-( a ten label jest na formie programu...

  • jak z programu (np. po naciśnięciu przycisku) odnaleźć w dll-u identyfikator B1 i wykonać przypisane temu identyfikatorowi zadaniehmm... jeśli dany identyfikator nie istnieje w DLL-u to nic ma się nie dziać.

Proszę o pomoc i z góry dziękuję :-)--Pracuję w Delphi
+---------------------------+
Pozdrawiam
GG: 4079188
[email protected]

0

&gtProblemy:
&gt* nie wiem jak w dll-u zdefiniować zadania do wykonania bo on nie widzi tego label1...
&gtnie uznaje też ShowMessage :-( a ten label jest na formie programu...
&gt
&gt* jak z programu (np. po naciśnięciu przycisku) odnaleźć w dll-u identyfikator B1 i wykonać przypisane temu identyfikatorowi zadaniehmm... jeśli dany identyfikator nie istnieje w DLL-u to nic ma się nie dziać.

Wydaje mi sie, ze listing ktory wrzucilem wlasnie to robi. Ale moze nie rozumiem, co Ty rozumiesz przez identyfikator... Ja uznalem ze identyfikator to nazwa funkcji, ale moze nie mam razji.--Pawel {Delphi 6 Personal}

Po pierwsze: naciśnij F1

0

Zeby bylo jasne:

program:
@B1:=GetProcAddress(DllInstance,'B1'); *szukanie identyfikatora B1
if @B1=nil then *jesli go nie ma...
Label1.Caption:='Procedure not found';

dll:

procedure B1(X:TLabel); stdcall; //zdefiniowane zadanie do wykonania
begin
X.Caption:='OK';
end;
--Pawel {Delphi 6 Personal}

Po pierwsze: naciśnij F1

0

U mnie identyfikator to tak jakby zmienna którą się da wywołać (cecha procedury i funkcji), zawierająca kod źródłowy który ma zostać wykonany...
innymi słowy jest to taka procedura tudzież funkcja.
--Pracuję w Delphi
+---------------------------+
Pozdrawiam
GG: 4079188
[email protected]

0

Naszy napisał:
U mnie identyfikator to tak jakby zmienna którą się da wywołać (cecha procedury i funkcji), zawierająca kod źródłowy który ma zostać wykonany...
&gtinnymi słowy jest to taka procedura tudzież funkcja.

To czemu jest jakis problem z moim kodem (przynajmniej jesli chodzi o label, bo ShowMessage mi sie nie chcialo :)))--Pawel {Delphi 6 Personal}

Po pierwsze: naciśnij F1

0
  • Skompilowałem DLL-a
  • Skompilowałem program według Twojego listingu (ten dłuuugi) :-)
  • Nie działa tzn. po naciśnięciu przycisku label się nie zmienia :[[ :[[ --Pracuję w Delphi
    +---------------------------+
    Pozdrawiam
    GG: 4079188
    [email protected]
0

A u mnie dziala. U ciebie wyrzuca jakis komunikat?--Pawel {Delphi 6 Personal}

Po pierwsze: naciśnij F1

0

Nie, nie wyrzuca nic...po prostu jak naciskam przycisk to KOMPLETNIE nic się nie dzieje...(łącznie z labelem).. hmm...

Bardzo proszę abyś mi przesłał w takim razie program + dll w pliku *.zip
Rozpakuję i zobaczę czy działa...na wszelki wypadek prześlij w tym pliku też wszystkie źródła do programu i dll-a

[email protected] :-)--Pracuję w Delphi
+---------------------------+
Pozdrawiam
GG: 4079188
[email protected]

0

pq napisał:
Ale mam pewna watpliwosc, otoz wydaje mi sie (moze nie mam racji), ze w delphi obiekty sa same z siebie wskaznikami. I mojej wersji tak naprawde tez przekazywany jest wskaznik.

Moje przypuszczenia potwierdza wynik nastepujacego kodu:
Label1.Caption:=IntToStr(SizeOf(TLabel));

Ale jesli nie mam racji, to prosze o oswiecenie.

Testowałem to i masz rację. Różnica w wydajności jest znikoma (w granicach błędów obliczeń). Widać Delphi zamienia wszelkie przekazania obiektów na przekazania ich wskaźników. Moje stwierdzenie co do przekazywania wskaźników sprawdzają się za to w zastosowaniu do stringów, recordów, tablic i innych dużych, ale prostych typów. (przy stringu jakieś 100 razy szybciej działało przekazywanie danych - oczywiście stringów stałych).--Jest jeszcze jeden błąd ... :)

Apel: Piszcie w tematach o jaki język programowania chodzi np. : [Delphi], [C++], itp.

Pomoc do Delphi po polsku. http://www.4programmers.net/forum/index.php?action=show&id=21335&c=2

Oficjalny kanał IRC serwisu 4programers:
serwer: warszawa.ircnet.pl sieć: POLNet kanał: #4programmers.net

0

dzieki Dryobates za przetestowanie oraz oswiecenie. generalnie uzywam zwykle typow dynamicznych (nawet rekordy zwykle mam albo male, albo przekazuje tablice dynamiczna rekordow), tym nie mniej warto miec swiadomosc problemu.--Pawel {Delphi 6 Personal}

Po pierwsze: naciśnij F1

1 użytkowników online, w tym zalogowanych: 0, gości: 1