Hallo, ich möchte einen COM-Server schreiben, der eine Form anzeigt. VBS-Skript 1 ruft Methode auf zum anzeigen von Form. Dann startet Skript 1 ein Skript 2. Skript 2 soll nun auf immer noch angezeigt Form schreiben können. Wie mach ich das ????
Announcement
Collapse
No announcement yet.
Delphi COM-Server von 2 Skripte gleichzeitig ansprechen
Collapse
X
-
Hallo,
auch dann, wenn im Delphi-Wizard für Automation-Server der Eintrag <i>Multi-Instanz</i> ausgewählt wird, erhält jeder Client seine eigene Instanz des COM-Objekts. Alle Instanzen werden nur in einem gemeinsamen Serverprozess ausgeführt, d.h. somit teilen sich alle Clients nur die globalen Daten des Servers. Die COM-Objekte mit ihren Objektfeldern hingegen "gehören" nur jeweils einem einzigen Client. Der Grund für dieses Verhalten liegt im Aufbau der ClassFactory-Klassen von Delphi.
Um dieses Verhalten zu ändern, muss das eigene COM-Objekt als <b>Singleton</b>-Server implementiert werden. Ein Weg dazu besteht im Ableiten einer eigenen Class Factory:
<pre>
function TSingletonAutoObjectFactory.CreateComObject(const Controller: IUnknown): TComObject;
begin
if FCOMObj = nil then
FCOMObj := inherited CreateComObject(Controller);
Result := FCOMObj;
end;
destructor TSingletonAutoObjectFactory.Destroy;
begin
FCOMObj := nil;
inherited;
end;
</pre>
Im <b>initialization</b>-Abschnitt der Unit wird die neue Class Factory scharfgemacht:
<pre>
// {$DEFINE NO_SINGLETON}
initialization
{$IFDEF NO_SINGLETON}
TAutoObjectFactory.Create(ComServer, TSingletonSrvExample, Class_SingletonSrvExample,
ciMultiInstance, tmApartment);
{$ELSE}
TSingletonAutoObjectFactory.Create(ComServer, TSingletonSrvExample, Class_SingletonSrvExample,
ciMultiInstance, tmApartment);
{$ENDIF}
end.
</pre>
Die ausführliche Beschreibung dieses Prinzips ist in meinem Buch <i>COM/DCOM/COM+ mit Delphi</i> zu finden
Comment