Page 1 of 2 1 2 LastLast
Results 1 to 15 of 18

Thread: Gui Parent (Tpanel) laten invullen door DLL

  1. #1
    Senior Member screner's Avatar
    Join Date
    Jun 2005
    Location
    Oss
    Posts
    141

    Gui Parent (Tpanel) laten invullen door DLL

    Hallo allemaal,

    Ik zit met een vraag en weet niet hoe ik dit het beste kan aanpakken en vraag naar jullie deskundigheid in deze.

    Na het inloggen wordt mijn GUI opgebouwd, daarna de nodige componenten waaronder een DBengine. Mijn GUI bestaat uit links een navigatievenster met een Ttreeview en centraal een Tpanel.

    Nu wil ik meer gebruik gaan maken van DLL's zodat ik delen van de code kan gaan updaten zonder dat ik alles opnieuw moet compileren.

    Mijn idee is als volgt:
    1. Na opbouw scan ik een directory "Plugins";
    2. Na een gevonden plugin, wordt er een TreeItem aangemaakt, gekoppeld met TData t.b.v. later gebruik.
    3. De DLL's worden dynamisch geladen in bijvoorbeeld een TDLLloader;
    4. Na aanroep van de DLL wil ik mijn DBengine naar de DLL sturen;
    5. De DLL doet zijn ding, bouwt een GUI (TFrame???) en zend deze terug naar de applicatie;
    6. De applicatie plaatst deze naar Tpanel1;

    Ik heb gezocht naar oplossingen en diverse fora's gelezen, maar ben er nog niet uit hoe ik:

    A. een Tobject naar een DLL kan sturen;
    B. een GUI vanuit DLL in TPanel kan plaatsen;

    Heb Sharemem geprobeert, maar kom er niet uit.

    Is wat ik wil überhaubt mogelijk?? en zo ja? heeft iemand een klein voorbeeldje waar ik mee verder kan stoeien? Vast bedankt

  2. #2
    Fornicatorus Formicidae VideoRipper's Avatar
    Join Date
    Mar 2005
    Location
    Vicus Saltus Orientalem
    Posts
    5,708
    Tuurlijk, alles kan binnen Delphi

    Wellicht kunnen deze resources je verder helpen:Greetz,

    Peter.
    TMemoryLeak.Create(Nil);

  3. #3
    als ik jou was zou ik ook eens naar packages kijken. Dat zijn op zich ook gewoon DLL's, maar makkelijker te gebruiken in Delphi en je kunt gewoon de objecten aanspreken. Er zijn hier al meerdere discussies over geweest.

    Nadeel van packages is dat je gebonden bent aan Delphi, maar als ik je vraag zo lees is dat voor jou geen probleem.

  4. #4
    Senior Member AntonSteen's Avatar
    Join Date
    Dec 2006
    Location
    IJsselmonde (Rotterdam)
    Posts
    352
    Dit is voor mij een website waar ik enorm veel van af haal, zo ook over het gebruik van dll's .
    Teach yourself Borland Delphi Hoewel wat gedateerd, is nog veel zeer bruikbaar, succes
    Lazarus als hobby, en dan niet in de kroeg
    http://www.wavdsteen.com

  5. #5
    Senior Member screner's Avatar
    Join Date
    Jun 2005
    Location
    Oss
    Posts
    141
    Heren,

    Bedankt voor de reacties voor zover. Ik ben wat dat betreft nieuw met het maken van Dynamische DLL's. Het is me wel al gelukt om een component over te laten erven van de applicatie naar de DLL en deze te besturen vu de DLL.

    Ik heb hiervoor een Class aangemaakt, die ik gebruik in de Mainapp als in de DLL:

    Code:
    type TTestData = Class
            ID                    :Integer;
            Naam                :Ansistring;
            Caption             :TCaption;
            Bool                  :Boolean;
            Panel                :Tpanel;
    end;
    En die heb ik als volgt aan de DLL meegegeven:

    Code:
    procedure TTestApp.Button1Click(Sender: TObject);
    var
      Adll: HModule;
      Updata: procedure(var AData: TTestData);
      D :TTestData;
    begin
      Adll       := LoadLibrary('TestDLL.dll');
      if Adll <> 0 then
      begin
        @Updata := GetProcAddress(Adll, 'UpData');
        if Assigned(Updata) then
        begin
            D := TTestData.Create;
            D.ID               := 96;
            D.Naam             := Format ('test AnsiString %D',[D.ID]);
            D.Caption          := Panel1.Caption;
            D.Bool              := True;
            D.Panel            := Panel1;
            UpData(D);
        end
        else
        ShowMessage('Procedure Niet gevonden in het DLL??tje...');
        FreeLibrary(Adll);
      end
      else
        ShowMessage('Foutje, DLL bestaat niet....');
    end;
    Dat werkt, maar is dit een verstandige keuze??? Ik ga zo even verder prutsen ;-)

  6. #6
    Senior Member screner's Avatar
    Join Date
    Jun 2005
    Location
    Oss
    Posts
    141
    Oke, ben even verder gaan prutsen. In de DLL maak ik een Tpanel aan op de Class TestData.Panel die ik mee heb gegeven en krijg een vreemde melding.

    "Cannot assign a Tfont to a Tfont"

    Wanneer ik eerst een Tform aanmaak, kan ik de Tpanel wel weergeven in de Tform, zonder meldingen. Dit heb ik gebakken in de DLL:

    Code:
    Procedure UpData (var AData :TTestData);
    var
    Apanel :TPanel;
    Aform :Tform;
    AAPanel :Tpanel;
    begin
    APanel             := Adata.Panel;
    Apanel.Align     := albottom;
    Apanel.Caption := Adata.Naam;
    AData.Caption  := 'Deze tekst is in de DLL aangepast';
    
    AForm          := TForm.Create(Application);
    Aform.Show;
    AAPanel        := TPanel.Create(APplication);
    
    //Aapanel.Assign(Adata.Panel.parent); ** werkt niet**
    AApanel.Parent := Aform; // **Werkt**
    AApanel.Caption := Adata.Caption; // **Werkt**
    AApanel.Align  := AlRight; // **Werkt**
    //Aapanel.Parent := Adata.Panel;  ** werkt niet**
    
    
    end;
    Het lijkt er dus op dat ik in deze alleen 1 richtingsverkeer kan realiseren. Iemand ervaring / idee?

  7. #7
    Senior Member screner's Avatar
    Join Date
    Jun 2005
    Location
    Oss
    Posts
    141
    Edit:

    Oke, wat ik in principe wilde is gelukt, ten minste zo lijkt het op het eerste gezicht. Misschien is het een workaround, maar voorlopig lijkt het een oplossing.

    Code:
    Function UpData (var AData :TTestData):TTestData;
    var
    Apanel :TPanel;
    begin
    APanel         := Adata.Panel;
    Apanel.Align   := Alclient;
    Application.CreateForm(TForm1,Form1);
    Form1.ParentWindow     := Apanel.Handle;
    Form1.Align:=alclient;
    end;
    
    
    exports
    Updata;
    Is dit een veilige keuze? zowel t.b.v. geheugengebruik als in kwaadwillend gebruik? Graag julllie visie
    Last edited by screner; 22-Aug-13 at 15:23.

  8. #8
    Wat bedoel je met kwaadwillend gebruik?
    Marcel

  9. #9
    Senior Member screner's Avatar
    Join Date
    Jun 2005
    Location
    Oss
    Posts
    141
    Bijvoorbeeld een virus, of een handige gebruiker die uit is op bedrijfsgevoelige data. Om zomaar iets te noemen?

  10. #10
    Hmm, ik denk dat je daar sowieso niet tegen beschermt bent. Een DLL is gevaarlijker omdat deze in de space van je programma draait en zou dus meer kunnen dan een gewone virus / hacker oplossing.
    Marcel

  11. #11
    Senior Member screner's Avatar
    Join Date
    Jun 2005
    Location
    Oss
    Posts
    141
    Oké, dat is dus iets om rekening mee te houden. Zal dan bepaalde functionaliteiten af moeten gaan schermen.

    Ik ga even verder met testen. Ben benieuwd of het idee ook een stabiele is.

  12. #12
    Senior Member screner's Avatar
    Join Date
    Jun 2005
    Location
    Oss
    Posts
    141
    Ik heb een "gebrek" gevonden, niet zo zeer in de code, maar met de Call convention. Wanneer ik een functie exporteer met StdCall krijg ik een foutmelding. Wanneer ik dit achterweg laat, blijft de foutmelding uit.

    De enige beperking, voor zover ik me herinner, is dat de DLL alleen vanuit een Delphi omgeving kan worden gebruikt. Weet iemand nog meer beperkingen?


    Edit: Dom dom dom... had in m'n app de call convention niet meegegeven. :-S
    Last edited by screner; 23-Aug-13 at 23:12.

  13. #13
    mov rax,marcov; push rax marcov's Avatar
    Join Date
    Apr 2004
    Location
    Ehv, Nl
    Posts
    10,357
    _Dezelfde_ Delphi versie met sharemem in alle modules (EXE,DLL) die die DLL of datastructuren daaruit gebruiken.

  14. #14
    Senior Member screner's Avatar
    Join Date
    Jun 2005
    Location
    Oss
    Posts
    141
    Quote Originally Posted by marcov View Post
    _Dezelfde_ Delphi versie met sharemem in alle modules (EXE,DLL) die die DLL of datastructuren daaruit gebruiken.
    Geldt dat ook wanneer je wel de Stdcall toevoegt? Want dan maakt de call toch gebruik van de standaard windows caller?

  15. #15
    mov rax,marcov; push rax marcov's Avatar
    Join Date
    Apr 2004
    Location
    Ehv, Nl
    Posts
    10,357
    Quote Originally Posted by screner View Post
    Geldt dat ook wanneer je wel de Stdcall toevoegt? Want dan maakt de call toch gebruik van de standaard windows caller?
    Ja. Calling convention matchen is een voorwaarde voor het aanroepen van procedures.

    Zogauw je echter iets doet waarbij geheugen allocatie niet volledig geisoleerd is (b.v. automatische types die dat gebruiken) of objecten (VMTs), dan wordt het lastiger.

    Geldt overigens ook voor b.v. een C++.
    Last edited by marcov; 31-Aug-13 at 16:57.

Page 1 of 2 1 2 LastLast

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Tags for this Thread

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •