DLL i problem z odwolaniem

0

Chce zrobic biblioteke DLL ktora bedzie sie odwolywac do komponentu w glownej aplikacji.

czyli: mam program A z memo, ktory wykorzystuje biblioteke B. Owa biblioteka ma zawierac kod ktory wypisze w memo (w programie A) jakis tekst, np tekst z bibiolteki DLL.

jak takie cos zrobic?

0

Jest wiele sposobów.
Oto jeden z nich (zapis w C++, bo nie znam się na wskaźnikach w Delphi :-():

  1. eksportujesz z DLL jakąś funkcję GetHandle(TMemo *uchwyt);
  2. z programu głównego odpalasz tę funkcję z paramtrem Memo1
  3. w DLL przypisujesz sobie do zmiennej globalnej TMemo *memo; uchwyt, czyli: memo = uchwyt;
  4. wpisujesz z DLL tekst: memo->Lines->Add("coś tam");

Powinno działać - pisałem z głowy.

0

Marooned napisane z glowy ale OK (ofcoz nie dotyczy to skladni bo tejze z delphi nie znam i nie mam zamiaru poznac) ale sposob rozwiazania stosowany i poprawny :-)

0

wiem ze mniej wiecej tak to trzeba zrobic ale wszystkie moje proby koncza sie bledem, juz nie wiem jak zaczac :(

ps. DLL bedzie wywolywane statycznie

0

Tłumacząc z grubsza powyższe wskazówki na Delphi:
w DLL'u tworzysz zmienną globalną: Memo: TMemo;,
procedurę:

GetHandle(uchwyt: TMemo);
begin
 Memo:=uchwyt;
 end;

i procedurę:

WriteInMemo;
begin
 Memo.Lines.Add(Jakiś_tam_tekst);
 end;

następnie wywołujesz w programie GEtHandle(Memo1);
i WriteInMemo;. Powinno pomóc.

0

nie dziala, tak jak moj i twoi sposob ma blad, zmienna memos:tmemo nie jest rozpoznawalna.
nie pomoglo mi nawet przekopoiwanie wszystkich uses'ow z programu glownego. czy trzeba uzyc klasy tform? czy moze jakis uses pominolem?

oto co wpisalem w uses: Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs;

uses - nazywam tak moduly ktore wpisujemy w tej sekcji, dla wygody osobistej ;)

0

Ale do tego musisz miec header w ktorym pokazesz programowi jakie funkcje eksportuje dll - czuyli ta GetHandle(...).
Inkludujesz do progsa robisz LoadLibrary(...) - przynajmniej w WinApi jak to jest w Delphi ?! i wywolujesz ta funkcje - progs juz wie ze takowa istnieje a poniewaz wczesniej zaladowales dll to i kod ja wykonujacy jest juz w zasiegu !!

0

Inkludujesz do progsa robisz LoadLibrary(...) - przynajmniej w WinApi jak to jest w Delphi ?!

snaj - patrz wyżej:

ps. DLL bedzie wywolywane statycznie

Czyli LoadLibrary odpada ;-).

0

wywolanie statyczne dll - hmm troche dziwnie to brzmi [diabel] niesadzicie - nie bede rozwijal skrotu dll :) !! Mam rozumiec ze dll bedzi ladowane przy starcie progsa wiec wystarczy ze dll bedzie poprawnie napisany a do progsa dodany header czy jak to tam sie nazywa w deplhi i nie ma problemu.

Jesli chodzi o cos statycznego to radze zainteresowac sie lib-ami ;)

0

juz mi dziala, dzieki wam za pomoc :)

oto kodzik jakby kogos to interesowalo:
w projectdll.dll:

library Projectdll;

uses
 StdCtrls;
  
var
    Memo: TMemo;
{$R *.res}

procedure GetHandle(uchwyt: TMemo);
begin
Memo:=uchwyt;
end;

procedure WriteInMemo(s:string);
begin
Memo.Lines.Add(s);
end; 

exports GetHandle index 20,WriteInMemo index 21;

begin
end.

i program glowny:

unit Unit1;

interface

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

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

var
  Form1: TForm1;

procedure get(uchwyt: TMemo); external 'Projectdll.dll' index 20;
procedure writememo(s:string); external 'Projectdll.dll' index 21;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
get(memo1);
writememo('ddd');
end;

end.

brakowalo modulu StdCtrls ;)

dzieki za pomoc

ps. a moze ktos wie jak wykonywac operacje jakims komponentem odnoszac sie do komponentu na formie?
chodzi mi o directX: czyli rysowanie w delphiX ;) to tak przy okazji

//snaj - DLL faktycznie znaczy dynamiczna biblioteka ale wywolanie to calkiem inna sprawa, dynamic link library znaczy tyle ze mozna w kazdej chwili mozna kod zastapic nowym bez potrzeby zmieniania calego programu, to samo tyczy sie zasobow

0

Dla porzadku : DLL jest plikiem z kodem wykonywalnym, ktory jest linkowany (laczony z kodem programu) w sposob dynamiczny ! To znaczy ze nie robi tego linker kompilatora ale sam system operacyjny.
A co do statycznych DLL to chodzi o to ze system laduje kod DLL'a do pamieci w t ym samym czasie w ktorym laduje kod progsa i z punktu widzenia progsa kod ten jest caly czas dostepny w pamieci czytaj statyczny. LoadLibrary pozwala natomiast kontrolowac programowo kiedy kod DLL'ki jest ladowany do pamieci, jednakowoz naklada na nas obowiazek jego zwolnienia, co w pierwszym przypadku spada na system

0

Ale panowie zakręciliście z tym rozwiązaniem.
Mi udało się to deklarując parametry funkcji z dll przez 'var'. Obyło się bez zabaw z uchwytami, no i wszystko robiła jedna funkcja.

0

Obyło się bez zabaw z uchwytami, no i wszystko robiła jedna funkcja.

Tylko ci się wydaje, że to było bez zabawy z uchwytami. Tak na prawdę, to to były uchwyty, tylko ty tego nie widziałeś (kompilator Delphi się zajął tym za ciebie). Jak walisz funkcję (bądź procedurę) podając w parametrach var cośtam: TObject (TMemo jest pochodną od TObject) to tak na prawdę przekazujesz tylko uchwyt do obiektu. W tym rozwiązaniu wyżej wychodzi na to samo. Tam też, poza faktem, że zmienna nazywa się uchwyt nie widać, że to jest robione na uchwytach. Rozdzielenie operacji na dwie funkcje to nie komplikacja, a ułatwienie. Raz wywołujesz GetHandle(Memo1);, a potem nie musisz walić Memo1 w parametrach za każdym razem, gdy chcesz coś dopisać w tym Memo. To taka dygresja w celu wyjaśnienia, mam nadzieję, że zrozumiałeś o co mi chodzi.

0

No to dzięki za wyjaśnienia [browar]
Wiem, że w efekcie wszystko kończy sie na uchwytach, ale prostata wywołania przez var polega na tym, że ja nie musiałem nimi operować.
I jakby nie patrzeć rozwiązanie typu :

Procedure Jakas(var x:TMemo);
begin
x.lines.add('Jakiś tekst');
end;

jest jednak prostsze. No ale co kto woli.
Każde rozwiązanie jest dobre, jeśli prowadzi do porawidłowych wyników.

0

masz racje, jest to wygodne i szybsze w pisaniu
dzieki za podpowiedz :)

(najtrudniej znalezc proste rozwiazania :))

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