Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Komunikacija izmedju programa <> plugina

[es] :: Pascal / Delphi / Kylix :: Komunikacija izmedju programa <> plugina

[ Pregleda: 1972 | Odgovora: 10 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

reiser

Član broj: 7895
Poruke: 2314



+102 Profil

icon Komunikacija izmedju programa <> plugina04.02.2008. u 00:33 - pre 197 meseci
Pisem jedan program u delphi-u i sad on treba da ima podrsku za plugine.. Samo sto ne znam kako je najbolje da realizujem to.

Jedino mi pada na pamet da plugine kompajliram kao posebne DLL-ove, recimo, taj DLL ce imati jednu standardnu fju "ExecutePlugin(params)" koju ce glavni program pozivati, i tako za svaki plugin.

E sad, problem je sto ja ne znam kako da napravim da taj plugin, tj eksterni DLL, pristupa promenljivama koje se nalaze u glavnom programu. Recimo, imamo strukturu TUsers : TStringArray u glavnom programu i plugin treba da bude sposoban da brise/dodaje elemente u tu strukturu. To eksterni DLL ne moze da radi, bar ne direktno, ili se ja varam ??

Znam da manipulacija promenljivama u glavnom programu moze da se izvede pomocu neke vrste IPC-a (pipe recimo), ali ako glavni program ima recimo 1000 razlicitih struktura i promenljivih onda je to skoro pa nemoguce, jer bih trebao za svaku promenljivu/strukturu da pisem poseban kod koji ce ih menjati.

Hvala unapred :)

[Ovu poruku je menjao reiser dana 04.02.2008. u 01:51 GMT+1]
 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: Komunikacija izmedju programa <> plugina04.02.2008. u 11:26 - pre 197 meseci
Ako ćeš ti raditi te pluginove onda možeš koristiti pakete, tada ćeš moći i da pristupaš promenljivama. Ako su pluginovi za bilo koji jezik onda recimo pogledaj TC model pluginova. Ako radiš sa 1000 različitih struktura onda je vreme da redizajniraš model, na stranu pluginovi ti ćeš imati noćnu moru za održavanje koda. Ako su to neki TComponent naslednici kojima trebaš pristupati onda se može pomoću RTTI napisati relativno jednostavan property getter/setter za te komponente.
 
Odgovor na temu

reiser

Član broj: 7895
Poruke: 2314



+102 Profil

icon Re: Komunikacija izmedju programa <> plugina04.02.2008. u 11:54 - pre 197 meseci
Da, ja cu raditi te pluginove, i bitno mi je samo da mogu da se pokrecu iz mog programa.
Guglao sam malo na netu oko tih paketa (BPL) posto nikada nisam imao potrebu da ih koristim ranije, ali koliko sam skontao ako kasnije zelim da napisem novu verziju nekog plugina moram da rekompajliram i glavni program ? Jel ovo tacno ?

Citat:
Kada distribuirate Delphiev paket, ukoliko paket azurirate i bilo sta promenite u interfejs odeljku bilo koje izvezene jedinice paketa, potrebno je da ponovo kompajlirate sve aplikacije koje koriste taj paket. Ovo je neophodno ako klasi dodajete metode, ili svojstva, a nije neophodno kada dodajete globalne simbole (ili menjate neki deo koji se ne koristi u klijentskim aplikacijama). Promene koje pravite u implementacionom odeljku jedinica paketa ne predstavljaju nikakav problem

Da li ovo znaci da mogu da menjam kodove funkcija u implementation delu, a da ne smem da diram interface deo, tj da dodajem nove funkcije itd ?

Program nema "1000 struktura" to sam samo naveo kao primer ;)
 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: Komunikacija izmedju programa <> plugina04.02.2008. u 12:24 - pre 197 meseci
> Da li ovo znaci da mogu da menjam kodove funkcija u implementation delu, a da ne smem da diram interface deo, tj da dodajem nove funkcije itd ?

Upravo. Interfejs svake klase čini njen potpis/verziju što se upisuje u dcu (kasnije linkuje u exe) svi drugi koji koriste tu klasu imaju informaciju da koriste tačno određenu verziju. Promenom interfejsa menja se i potpis i tada kompajler javlja grešku unit xxx is compiled with different version of zzz.
 
Odgovor na temu

reiser

Član broj: 7895
Poruke: 2314



+102 Profil

icon Re: Komunikacija izmedju programa <> plugina04.02.2008. u 12:29 - pre 197 meseci
Thx :)
Evo napisao sam prosti paket koji eksportuje jednu funkciju i glavni program koji istu koristi. E sad, kako da pristupam promenljivama u glavnom programu iz ovog paketa ? Recimo, da paket promeni vrednost res promenljive koja je deklarisana u glavnom programu ?
Prikačeni fajlovi
 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: Komunikacija izmedju programa <> plugina04.02.2008. u 13:37 - pre 197 meseci
> E sad, kako da pristupam promenljivama u glavnom programu iz ovog paketa ? Recimo, da paket promeni vrednost res promenljive
> koja je deklarisana u glavnom programu ?

Trebalo bi da bude dovoljno ukljucuvanje main unita u uses sekciju pomocnog unita.
 
Odgovor na temu

priki

Član broj: 24732
Poruke: 700
*.static.t-2.net.

ICQ: 174153511


+26 Profil

icon Re: Komunikacija izmedju programa <> plugina04.02.2008. u 13:56 - pre 197 meseci
paketi ce ti obavezno trebati

koriste se interfejsi za pristupanje promenjivima u različitim pluginima
znaci imaš interfejs prema nekom plugin-u (zoveš plugin)

takodje, pogledaj Hydra, to je alat koji ti umnogome
olakšava rad sa plug-in-ima kad praviš tzv. host aplikacije
 
Odgovor na temu

reiser

Član broj: 7895
Poruke: 2314



+102 Profil

icon Re: Komunikacija izmedju programa <> plugina04.02.2008. u 14:19 - pre 197 meseci
Hvala, ali nisam uspeo da promenim varijablu iz plugina.. Glavni program izgleda ovako:

Code:

program MainProgram;

uses
  Windows,
  SysUtils,
  Variables in 'Variables.pas';

var
  pHnd    : HMODULE;
  NekaFja : function(const AParam : String) : DWORD;


begin
  pHnd := LoadPackage('Package1.bpl');
  If pHnd <> 0 Then
  Begin
    @NekaFja := GetProcAddress(pHnd, 'NekaFunkcija');
    If Assigned(NekaFja) Then
    Begin
      res := 34;
      NekaFja('03493409');
      MessageBox(0, PAnsiChar(IntToStr(res)), '', mb_OK);
    End;
    UnloadPackage(pHnd);
  End;
end.


Variables.pas unit:
Code:

unit Variables;

interface

uses
  Windows;

var
  res : DWORD;

implementation

end.


I na kraju, TestUnit.pas, tj package-plugin:

Code:

unit TestUnit;

interface

implementation

uses
  Windows, SysUtils, Variables;

function NekaFunkcija(const AParam : String) : DWORD;
begin
//  result := StrToInt(AParam);
  res := 324234;
  result := 0;
end;

exports
  NekaFunkcija;

end.


Kad startujem MainProgram, messagebox vrati "34", umesto 324234.
Prikacio sam source i u attachmentu.

//edit: Kad kompajliram package (TestUnit), compiler javlja Unit "variables" implicitly imported into package, mada pretpostavljam da je to normalno
Prikačeni fajlovi
 
Odgovor na temu

priki

Član broj: 24732
Poruke: 700
*.static.t-2.net.

ICQ: 174153511


+26 Profil

icon Re: Komunikacija izmedju programa <> plugina04.02.2008. u 14:28 - pre 197 meseci
procitaj i pogledaj video na ovoj temi

http://www.elitesecurity.org/t300778-programiranje-po-modulima
 
Odgovor na temu

reiser

Član broj: 7895
Poruke: 2314



+102 Profil

icon Re: Komunikacija izmedju programa <> plugina05.02.2008. u 14:51 - pre 197 meseci
Hvala, veoma korisno predavanje. :)
 
Odgovor na temu

Vojislav Mihailovic
Smed. Palanka

Član broj: 20436
Poruke: 12
77.46.242.*



Profil

icon Re: Komunikacija izmedju programa <> plugina13.02.2008. u 18:11 - pre 197 meseci
Pogledaj o ovu varijantu:

http://www.dragonsoft.us/products_dsps.php
 
Odgovor na temu

[es] :: Pascal / Delphi / Kylix :: Komunikacija izmedju programa <> plugina

[ Pregleda: 1972 | Odgovora: 10 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.