"The shell stopped unexpectedly and Explorer.exe was restarted."
Verwijderd
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
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
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.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?
Wil je ook andere talen ondersteunen (VC6, etc.), dan is COM/ActiveX waarschijnlijk de beste optie.
Verwijderd
Let er dan wel op dat je de ShareMem unit gebruikt...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.
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."
Eigenlijk is Delphi/C++ Builder eerst wel genoeg. Wat zijn BPL's precies? Ik ken BPL's alleen van Component Packages in design-time.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.
"The shell stopped unexpectedly and Explorer.exe was restarted."
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 bentOp 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.
Klinkt leuk, maar toch wil de applicatie weten wat voor type die frame is (TTestFrame in mijn geval).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
"The shell stopped unexpectedly and Explorer.exe was restarted."
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 geprobeerdOp 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).
Verwijderd
"The shell stopped unexpectedly and Explorer.exe was restarted."
Verwijderd
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.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)
"The shell stopped unexpectedly and Explorer.exe was restarted."
Verwijderd
[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.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...
"The shell stopped unexpectedly and Explorer.exe was restarted."
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
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
Bpl's (Borland Package Libraries) zijn in feite gewoon DLL's, maar dan met wat Delphi-specifieke toevoegingen m.b.t. streaming etc.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.
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...
Thanks voor de uitleg. Zal er es naar kijken.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...
En stuur die handout-CD maar op (via mail?).
"The shell stopped unexpectedly and Explorer.exe was restarted."
Verwijderd
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.
"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.
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.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.
Is dit (met die packages) dan nog steeds aan te raden?
"The shell stopped unexpectedly and Explorer.exe was restarted."
Verwijderd
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.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.
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."
http://www.codeguru.com/doc_view/DocViewInDll.shtml
http://www.codeguru.com/misc/ebd.shtml
Alleen - sorry
Trying to establish voice contact... please yell into keyboard.
"The shell stopped unexpectedly and Explorer.exe was restarted."
Verwijderd
Ik zal deze week wel wat mailen.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 begrijp wel ongeveer wat je wilt, ik begreep alleen niet wat het probleem was.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).
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.]
"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
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.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!
Dat zou relaxed zijn! Alvast bedankt!Op dinsdag 06 november 2001 20:03 schreef DiFool het volgende:
[..]
Ik zal deze week wel wat mailen.
[..]
"The shell stopped unexpectedly and Explorer.exe was restarted."