[Delphi] Een DLL met een stukje GUI erin

Pagina: 1
Acties:
  • 139 views sinds 30-01-2008
  • Reageer

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Topicstarter
Ik heb hier al eerder een topic over gehad, maar wil de boel toch even anders vragen.

Is het mogelijk om in een DLL een stukje interface te stoppen voor de applicatie. Dus dat de DLL een stukje interface opbouwt en dit in zijn geheel aan de applicatie geeft die hem aanroept. Die applicatie toont dit stukje interface aan de gebruiker.

Ik vraag me alleen af hoe het zit met events e.d.

Wat mijn doel is? Een applicatie schrijven met een plugin idee. De DLL's zijn dus plugins.
Of kan ik dit beter op een andere manier oplossen volgens jullie?

"The shell stopped unexpectedly and Explorer.exe was restarted."


Verwijderd

Ik vond dit op torry.net moet je maar even zoeken er staan voorbeeld files over.

This is demostraction of how to add a plugin function in Delphi your applications.
This time I enabled the plugin to talk to the host application by the same
as I did for the host app - Function Export.

Project1.dpr is the demo application
First.dpr is source code of plugin dll

  • johnwoo
  • Registratie: Oktober 1999
  • Laatst online: 16:48

johnwoo

3S-GTE

Mogelijk is het zeker :)
Van Delphi heb ik weinig kaas gegeten, maar in VB gaat het vrij makkelijk met een ActiveX DLL. Je kunt bijvoorbeeld een PictureBox gebruiken (of het Delphi equivalent), en het host programma een venstertje ter beschikking laten stellen. Vervolgens zet je je PictureBox (met alle controls die erop staan) in dat venster met een SetParent API call, waarmee je die PictureBox het kind van het venster maakt (of een kind van een andere PictureBox).
Hoe het zonder ActiveX zou moeten zou ik niet weten...

4200Wp ZO + 840Wp ZW + 1680Wp NW | 14xIQ7+ + 1xDS3-L | MTVenusE | HWP1


Verwijderd

Op zaterdag 03 november 2001 17:08 schreef jelmervos het volgende:
Wat mijn doel is? Een applicatie schrijven met een plugin idee. De DLL's zijn dus plugins.
Of kan ik dit beter op een andere manier oplossen volgens jullie?
Wanneer de plugins ook in Delphi/C++Builder geschreven zijn, kun je het beste kijken naar bpl's en het streaming mechanisme van Delphi zelf.
Wil je ook andere talen ondersteunen (VC6, etc.), dan is COM/ActiveX waarschijnlijk de beste optie.

  • Bigs
  • Registratie: Mei 2000
  • Niet online
Kun je niet gewoon een Unit met een Frame maken en dan die frame in je app zetten? Een frame is zeg maar een form in een form.

Verwijderd

Op zondag 04 november 2001 13:23 schreef Bigs het volgende:
Kun je niet gewoon een Unit met een Frame maken en dan die frame in je app zetten? Een frame is zeg maar een form in een form.
Let er dan wel op dat je de ShareMem unit gebruikt...

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Topicstarter
Dat met die frames heb ik idd geprobeerd. Leek mij een mooie oplossing. Maar dan zit je ermee dat je applicatie moet weten wat voor type het frame is.
Dus als je in je DLL een frame stopt (TTestFrame bijvoorbeeld) dan moet de applicatie het type TTestFrame wel kenne.

"The shell stopped unexpectedly and Explorer.exe was restarted."


  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Topicstarter
Op zondag 04 november 2001 13:20 schreef Afterlife het volgende:

[..]

Wanneer de plugins ook in Delphi/C++Builder geschreven zijn, kun je het beste kijken naar bpl's en het streaming mechanisme van Delphi zelf.
Wil je ook andere talen ondersteunen (VC6, etc.), dan is COM/ActiveX waarschijnlijk de beste optie.
Eigenlijk is Delphi/C++ Builder eerst wel genoeg. Wat zijn BPL's precies? Ik ken BPL's alleen van Component Packages in design-time.

"The shell stopped unexpectedly and Explorer.exe was restarted."


  • Bigs
  • Registratie: Mei 2000
  • Niet online
Op zondag 04 november 2001 13:42 schreef jelmervos het volgende:
Dat met die frames heb ik idd geprobeerd. Leek mij een mooie oplossing. Maar dan zit je ermee dat je applicatie moet weten wat voor type het frame is.
Dus als je in je DLL een frame stopt (TTestFrame bijvoorbeeld) dan moet de applicatie het type TTestFrame wel kenne.
Kun je dan in je DLL niet een functie zetten die het Frame on-the-fly opbouwt? Dus dat je gewoon een standaard (leeg) frame in je app en de dll defineert en dan met een functie in je DLL vervolgens alle componenten erop zet. Beetje omslachtig, maar het kan wel werken op zich. Wel goed opletten dat je alles netjes opruimt als je klaar bent :)

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Topicstarter
Op maandag 05 november 2001 11:30 schreef Bigs het volgende:

[..]

Kun je dan in je DLL niet een functie zetten die het Frame on-the-fly opbouwt? Dus dat je gewoon een standaard (leeg) frame in je app en de dll defineert en dan met een functie in je DLL vervolgens alle componenten erop zet. Beetje omslachtig, maar het kan wel werken op zich. Wel goed opletten dat je alles netjes opruimt als je klaar bent :)
Klinkt leuk, maar toch wil de applicatie weten wat voor type die frame is (TTestFrame in mijn geval).

"The shell stopped unexpectedly and Explorer.exe was restarted."


  • Bigs
  • Registratie: Mei 2000
  • Niet online
Op maandag 05 november 2001 11:43 schreef jelmervos het volgende:

[..]

Klinkt leuk, maar toch wil de applicatie weten wat voor type die frame is (TTestFrame in mijn geval).
Ja, maar als je nou gewoon in je app zo'n TTestFrame defineert en in je DLL dan werkt dat toch of niet? Gewoon een leeg standaard frame met niks erin en dan dan nog een array of TObject voor de componenten die je erop gaat zetten (mocht dat nodig zijn). Zit nu op school en heb hier geen Delphi anders had ik het ff geprobeerd :) Maar volgens mij moet het wel kunnen.

Verwijderd

Tuurlijk is dit gewoon mogelijk. In je USES clause van de Dll de unit aangeven van het Form en klaro. Nu alleen nog een (exports) methode in de dll die je form aanroept...

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Topicstarter
Oke, maar het moet wel dynamisch zijn. Dus dat er in de toekomst zo een nieuwe DLL bij kan worden geplaatst zonder dat ik de applicatie hoef te veranderen.

"The shell stopped unexpectedly and Explorer.exe was restarted."


Verwijderd

Dan doe je (net als bij een winamp) een "directory scan" naar de dll's.

Moet je wel zorgen dat alle dll's dezelfde structuur exporteren.

Dus dan wordt het Handle := LoadLibrary('JouwDll');
(dynamischer krijg je het niet :) )

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Topicstarter
Op maandag 05 november 2001 13:11 schreef robh het volgende:
Dan doe je (net als bij een winamp) een "directory scan" naar de dll's.

Moet je wel zorgen dat alle dll's dezelfde structuur exporteren.

Dus dan wordt het Handle := LoadLibrary('JouwDll');
(dynamischer krijg je het niet :) )
Dat snap ik wel ja. Maar nu moet die DLL nog een stukje GUI aan de applicatie geven. Bijvoorbeeld een soort panel met een ListView en wat events enzo.

"The shell stopped unexpectedly and Explorer.exe was restarted."


Verwijderd

Dat is toch al gezegd??? uses....

[edit]

Oh ja niet vergeten om alles als PCHAR door te geven...

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Topicstarter
Op maandag 05 november 2001 13:46 schreef robh het volgende:
Dat is toch al gezegd??? uses....

[edit]

Oh ja niet vergeten om alles als PCHAR door te geven...
Of ShortString. Maar omdat ik toch ShareMem opgeef moeten Strings ook wel werken.

"The shell stopped unexpectedly and Explorer.exe was restarted."


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 21:46

Creepy

Tactical Espionage Splatterer

als je sharemem gebruikt, dan moet diegene die de DLL maakt OOK sharemem gebruiken.. dus als je verwacht dat iemand een DLL gaat maken in VB/C++/whatever.. sharemem dumpen en pchar gebruiken.

Moet de GUI van de DLL helemaal bestuurbaar zijn vanaf je hoofdprogramma? Lijkt me van niet.. gewoon een functie maken in de dll die dat stukje GUI laat zien.. hoef je helemaal niet moeilijk te doen. Je zou nog in de functie aanroep een windhow handle (HWND) mee kunnen laten geven zodat je dat als parent window kan gebruiken
code:
1
2
3
4
5
form1:=TMyGuiform.create(nil)
form1.parentwindow:=<dat window handle hiero> // dit is zelfs niet eens nodig,              
                                // maar weet niet zeker of dat showmodal dan goed wertkt
form1.showmodal;
form1.release;

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Verwijderd

Op zondag 04 november 2001 13:43 schreef jelmervos het volgende:
Wat zijn BPL's precies? Ik ken BPL's alleen van Component Packages in design-time.
Bpl's (Borland Package Libraries) zijn in feite gewoon DLL's, maar dan met wat Delphi-specifieke toevoegingen m.b.t. streaming etc.
Ik moet eerlijk toegeven dat ik er zelf nog nooit iets mee heb gedaan, maar Mark Miller (www.eagle-software.com) gebruikt 't bv. als plugin mechanisme voor CodeRush.
Op de laatste CTTM heeft 'ie daar nog een sessie aan gewijd, als je wilt kan ik je de tekst van de handout-CD wel sturen...

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Topicstarter
Op maandag 05 november 2001 20:47 schreef Afterlife het volgende:

[..]

als je wilt kan ik je de tekst van de handout-CD wel sturen...
Thanks voor de uitleg. Zal er es naar kijken.
En stuur die handout-CD maar op (via mail?).

"The shell stopped unexpectedly and Explorer.exe was restarted."


Verwijderd

Ik snap het probleem niet helemaal, maar hier iig een voorbeeld. Zet de unit in een package en maak die run-time.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
unit PanelPackUnit;

interface

uses
  Controls, Classes;

function GetPanel(AOwner: TComponent; AParent: TWinControl): Boolean;

implementation

uses
  ExtCtrls, Dialogs;

type
  TEventComp = class(TComponent)
  protected
    procedure PanelClicked(Sender: TObject);
  end;

var
  EventComp: TEventComp;

procedure TEventComp.PanelClicked(Sender: TObject);
begin
  ShowMessage('Click');
end;

function GetPanel(AOwner: TComponent; AParent: TWinControl): Boolean;
begin
  with TPanel.Create(AOwner) do
  begin
    Parent := AParent;
    SetBounds(1, 1, 140, 110);
    OnClick := EventComp.PanelClicked;
  end; 
  Result := True;
end;

initialization
  EventComp := TEventComp.Create(nil);
finalization
  EventComp.Free;
end.

EventComp wordt gebruikt om de events af te handelen, als je die niet in de package wil afhandelen, zul je die 1 voor 1 run-time moeten setten, denk ik.

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Topicstarter
Thanks, ik heb die package gemaakt en run-time gemaakt. Daarna een compile gedaan. Maar hoe nu verder. Er moet toch een applicatie komen die die package runtime opent en gebruikt. Hoe moet dit dan precies?

"The shell stopped unexpectedly and Explorer.exe was restarted."


Verwijderd

  • Statisch Zet PanelPackUnit in de uses clausule. [Edit: en zet [alleen] deze package bij Options|Packages|Runtime Packages en vink 'Build with Runtime Packages' aan]
  • Dynamisch Gebruik LoadPackage/UnloadPackage; Deze zijn in dit geval wel lekker link natuurlijk, omdat je een instance in de package hebt gecreeerd, die zul je eerst moeten destroyen.

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Topicstarter
Op dinsdag 06 november 2001 17:36 schreef DiFool het volgende:
  • Statisch Zet PanelPackUnit in de uses clausule. [Edit: en zet [alleen] deze package bij Options|Packages|Runtime Packages en vink 'Build with Runtime Packages' aan]
  • Dynamisch Gebruik LoadPackage/UnloadPackage; Deze zijn in dit geval wel lekker link natuurlijk, omdat je een instance in de package hebt gecreeerd, die zul je eerst moeten destroyen.
Het moet zowiezo dynmische, dat is juist het idee van een plug-in systeem. Dat je applicatie gelijk blijft, maar dat je er zo nieuwe plug-ins bijgooit en dat je applicatie deze run-time gebruikt.
Is dit (met die packages) dan nog steeds aan te raden?

"The shell stopped unexpectedly and Explorer.exe was restarted."


Verwijderd

Het statisch/dynamisch slaat niet op het tijdstip vh linken, maar op het tijdstip vh laden van de bpl;

statisch laden -> bpl wordt geladen bij het starten van de applicatie; geunload bij het afsluiten van de applicatie

dynamisch laden -> bpl wordt geladen bij het aanroepen van LoadPackage; geunload bij het aanroepen van UnloadPackage.

Ik weet niet wat je precies wilt, maar ik zou in dit geval voor statisch laden gaan.

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Topicstarter
Op dinsdag 06 november 2001 18:09 schreef DiFool het volgende:
Het statisch/dynamisch slaat niet op het tijdstip vh linken, maar op het tijdstip vh laden van de bpl;

statisch laden -> bpl wordt geladen bij het starten van de applicatie; geunload bij het afsluiten van de applicatie

dynamisch laden -> bpl wordt geladen bij het aanroepen van LoadPackage; geunload bij het aanroepen van UnloadPackage.

Ik weet niet wat je precies wilt, maar ik zou in dit geval voor statisch laden gaan.
Thanks voor de uitleg. Heb je geen ICQ/MSN ofzo, dat praat net ff wat makkelijker. :)


Verder snap ik nog steeds niet waarom je niet begrijpt wat ik wil. Als doel wil ik een plugin systeem voor mijn applicatie. Daarbij moet een plugin een stukje GUI aan de applicatie geven, een panel bijvoorbeeld (met inhoud natuurlijk).

"The shell stopped unexpectedly and Explorer.exe was restarted."


  • Biedzjee
  • Registratie: December 2000
  • Laatst online: 14-08-2025
Volgens mij kun je hier iets mee:

http://www.codeguru.com/doc_view/DocViewInDll.shtml

http://www.codeguru.com/misc/ebd.shtml

Alleen - sorry :O - gaat het hier niet over Delphi maar over twee Visual-C projecten

Trying to establish voice contact... please yell into keyboard.


  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Topicstarter
Iig bedankt. Is altijd interessant. :)

"The shell stopped unexpectedly and Explorer.exe was restarted."


Verwijderd

Op dinsdag 06 november 2001 19:21 schreef jelmervos het volgende:

[..]

Thanks voor de uitleg. Heb je geen ICQ/MSN ofzo, dat praat net ff wat makkelijker. :)
Ik zal deze week wel wat mailen.
Verder snap ik nog steeds niet waarom je niet begrijpt wat ik wil. Als doel wil ik een plugin systeem voor mijn applicatie. Daarbij moet een plugin een stukje GUI aan de applicatie geven, een panel bijvoorbeeld (met inhoud natuurlijk).
Ik begrijp wel ongeveer wat je wilt, ik begreep alleen niet wat het probleem was. (8>

Als je gewoon een bpl maakt en die runtime/static laad, heb je wat je wilt volgens mij. Alleen over die events zul je nog wat moeten nadenken. [Wie moet ze afhandelen bpl/programma; Zijn het altijd dezelfde events waar het programma op moet reageren, kunnen er bijkomen, etc.]

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 21:46

Creepy

Tactical Espionage Splatterer

build with runtime packages? vink die maar UIT! Tenzij je wilt dat iedereen Delphi geinstalleerd heeft staan!

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Verwijderd

Op dinsdag 06 november 2001 20:07 schreef Creepy het volgende:
build with runtime packages? vink die maar UIT! Tenzij je wilt dat iedereen Delphi geinstalleerd heeft staan!
Gaat er om welke packages je bedoelt/aangeeft natuurlijk. Als je aangeeft dat je VCL50.bpl etc. als runtime packages wilt gebruiken, zul je ze ook mee moeten leveren. Das logisch. :)

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Topicstarter
Op dinsdag 06 november 2001 20:03 schreef DiFool het volgende:

[..]

Ik zal deze week wel wat mailen.
[..]
Dat zou relaxed zijn! Alvast bedankt! :)

"The shell stopped unexpectedly and Explorer.exe was restarted."

Pagina: 1