Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

  • 10 odgovora
  • 2.835 pregleda

Najnovija ↓

Komunikacija izmedju programa <> plugina 04.02.2008. u 01:33 · pre 228 meseci
izmenjeno 1 put, poslednji put reiser 04.02.2008. u 01:51
  1. reiser04.02.2008. u 01:51zapis iz teksta poruke
#1
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 :)
Re: Komunikacija izmedju programa <> plugina 04.02.2008. u 12:26 · pre 228 meseci #2
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.
Potpis
Do not be a help vampire (http://slash7.com/pages/vampires), use the google.

How to ask questions the smart way:
http://www.catb.org/~esr/faqs/smart-questions.html
http://solair.eunet.rs/~fangor...stions/smart-questions.sr.html
Re: Komunikacija izmedju programa <> plugina 04.02.2008. u 12:54 · pre 228 meseci #3
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 ;)
Re: Komunikacija izmedju programa <> plugina 04.02.2008. u 13:24 · pre 228 meseci #4
> 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.
Potpis
Do not be a help vampire (http://slash7.com/pages/vampires), use the google.

How to ask questions the smart way:
http://www.catb.org/~esr/faqs/smart-questions.html
http://solair.eunet.rs/~fangor...stions/smart-questions.sr.html
Re: Komunikacija izmedju programa <> plugina 04.02.2008. u 13:29 · pre 228 meseci #5
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 ?
Re: Komunikacija izmedju programa <> plugina 04.02.2008. u 14:37 · pre 228 meseci #6
> 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.
Potpis
Do not be a help vampire (http://slash7.com/pages/vampires), use the google.

How to ask questions the smart way:
http://www.catb.org/~esr/faqs/smart-questions.html
http://solair.eunet.rs/~fangor...stions/smart-questions.sr.html
Re: Komunikacija izmedju programa <> plugina 04.02.2008. u 14:56 · pre 228 meseci #7
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
Re: Komunikacija izmedju programa <> plugina 04.02.2008. u 15:19 · pre 228 meseci #8
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
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme