2010-07-06 2 views
1

J'ai créé un très petit objet automation (en utilisant delphi 7). Cela fonctionne, mais j'ai un problème pour l'enregistrer dans la table des objets en cours d'exécution afin que je puisse utiliser la fonction getActiveOleObject pour récupérer une instance en cours d'exécution du serveur. Le problème est que les événements Initialize et Destroy ne se déclenchent pas.Delphi - enregistrer un serveur COM dans le ROT

EDIT: Je viens de noter que le initialize est déclenché lorsque je crée l'application via CreateOleObject dans une application cliente.

EDIT2: Télécharger l'échantillon Projekt here

Voici le code source:

unit mycomserver; 

{$WARN SYMBOL_PLATFORM OFF} 

interface 

uses 
    ComObj, ActiveX, server_TLB, StdVcl, dialogs; 

type 
    Tmyserver = class(TAutoObject, Imyserver) 
    private 
    FROTCookie: Longint; 
    public 
    procedure Initialize; override; 
    destructor Destroy; override; 
    protected 
    procedure hello; safecall; 

    end; 

implementation 

uses ComServ; 

procedure Tmyserver.Initialize; 
begin 
    inherited; 
    //Register object in ROT 
    showmessage('Why the init event doesnt fire?'); 
    OleCheck(RegisterActiveObject(Self, CLASS_myserver, ActiveObject_Weak, FROTCookie)) 
end; 

destructor Tmyserver.Destroy; 
begin 
    // unegister object in ROT 
    showmessage('And destroy event also doesnt fire...'); 
    OleCheck(RevokeActiveObject(FROTCookie, nil)); 
    inherited; 
end; 

procedure Tmyserver.hello; 
begin 
    showmessage('hello its me the comserver'); 
end; 

initialization 
    showmessage('com server init works...'); 
    TAutoObjectFactory.Create(ComServer, Tmyserver, Class_myserver, 
    ciMultiInstance, tmApartment); 
end. 
+0

Vérifiez qu'il montre le code sur comment faire cela. http://www.blong.com/Conferences/IConUK2000/DelphiMoreAutomation/More%20Automation%20In%20Delphi.htm Vous avez peut-être déjà. –

+0

Ouais c'est exactement ce que j'ai déjà lu ... – ben

Répondre

0

je suppose que le serveur COM est initialisé automatiquement lorsque le serveur est démarré. Mais ce n'est pas le cas. J'ai donc créé une variable globale dans le Comserver, quelque chose comme

GlobalCOMInstance : Tmyserver; 

Dans l'application servcer en cas onShow, je simplement créé une instance de l'objet COM:

if not assigned(GlobalCOMInstance) then 
    mycomserver.Tmyserver.Create; 

Et c'est all;)

Questions connexes