2010-07-06 126 views
1

我创建了一个非常小的自动化对象(使用delphi 7)。 它可以工作,但我有问题将它注册到运行的对象表中,以便我可以使用getActiveOleObject函数来检索服务器的运行实例。 问题是Initialize和Destroy事件不会触发。Delphi - 在ROT中注册com服务器

编辑: 我刚刚注意到,初始化被激发,当我通过createOleObject在客户端应用程序中创建应用程序。

EDIT2: 下载样本PROJEKT here

这里的源代码:

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

看看它显示代码如何做到这一点。 http://www.blong.com/Conferences/IConUK2000/DelphiMoreAutomation/More%20Automation%20In%20Delphi.htm 您可能已有。 – 2010-07-06 21:57:04

+0

是啊,这正是我所读的... – ben 2010-07-07 05:12:41

回答

0

我假定服务器启动时COM服务器自动初始化。 但事实并非如此。 所以我创造了一个comServer全局变量,像

GlobalCOMInstance : Tmyserver; 

在昂秀事件servcer应用程序,我只是创建了COM对象的实例:

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

而这就是所有;)