[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/f[...]ion=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/f[...]ion=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

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