谁能帮我解决这个关于生成Auotmation object的问题!(100分)

  • 主题发起人 主题发起人 fussy
  • 开始时间 开始时间
F

fussy

Unregistered / Unconfirmed
GUEST, unregistred user!
我想生成一个Automation object,于是我这样做了:
环境:Delphi 4.0,Windows95
步骤:i)点按菜单File->New,然后选择ActiveX页的
Automation Object,确定后,出现对话框,
我所添入的内容为:
ClassName:TMyObject
Instance:internal
Threading moduel:Apartment;
点按OK键后...系统会自动生成一个.tlb文件(与你
的工程文件同名),另外会生成一个.pas文件。
ii)这时我在主form的uses里面加入Project_tlb单元
并且在主form生成变量
Var
MyObject:Variant;
同时我在窗体生成的事件里添入:
MyObject:=CoTMyObject.create;
在窗体关闭的事件里添入:
MyObject:=UnAssigned;
我认为上面的程序应该没有问题,但是一运行,就会出现
“类没有定义”的错误。
但是在Tlb编辑界面里的注册的按钮始终时无效的。

不得以,我采取了别的办法:
在生成Automation Object的时候,
Instance选择single或multiple instance(其实,我只要Internal
就可以了),结果类没有注册的问题解决了,但是另一个问题有出现了
(其余的地方我都没有动)
在每会我的执行程序退出的时候,系统都会说:
There still a active Com object in this application.
one or more Client may have refrences to this objcet
....
Are you Sure you want to close this application?
&Ok & Cancel
天啊,如果你的程序,每会退出的时候都有这个东西,那么太土了吧,
这个对话框又怎么去掉呢?
又如何将这个去掉呢?


 
当你按照上述方法定义了一个新的OleAuto Object时,
Delphi自动生成TLB文件的同时,会生成一个新的unit
(unit1或unit2...),其内容如下:(我定义的类叫Test)

unit Unit2;

interface

uses
ComObj, ActiveX, Project1_TLB;

type
Ttest = class(TAutoObject, Itest)
protected
{ Protected declarations }
end;

implementation

uses ComServ;

initialization
TAutoObjectFactory.Create(ComServer, Ttest, Class_test,
ciSingleInstance, tmApartment);
end.

这才是你应该用的unit,你应该定义:

uses Unit2;
...

var
myObj:TTest;
...

MyObj:=TTest.create;
...

结束时 MyObj.Free;
 
在 DELPHI4 中有一个 SAMPLE 程序演示了怎么样建立 AUTOMATION OBJECT,具体
位置是 <DELPHI PATH>/DEMO/ACTIVEX/OLEAUTO/AUTOSERV, 值得看一看。

COM,AUTOMATION,OLE,ACTIVEX,没有十来个回合是甭想高清楚的,最好的办法是
看样例程序。
 
怎么?没下文了?
我这可是来自Inprise的权威答案哟!
(因为这根本就是个简单问题)
 
非常感谢,两位大哥的帮助。
你们的答案对我启发很大。

对于这个问题,我还有两点不明白的的地方:
I) 也许有人会奇怪,为什么我用CoTMyObject.create来产生我的自动化对象
最后用将对象赋为UnAssigned来消散我的对象。
而不象Dwwang大哥那样用TMy.Create,释放用TMy.free.(我一开始也是这
样做的)。
实际上,我的目的是为了生成一个从IDispatch接口类的子类,用做同别的
OLE Server来通信的通道。
因为TAutoObj自动实现了IDispatch,所以我的类声明:
TMy=Class(TAutoObj,IMy)符合我的要求。
现在问题出现了,按照Dwwang大哥的指导,我用TMy.Create方法生成了MyObject
但是程序中需要传的参数类型为IDispatch,我直接传MyObject,编译器说不行,
我用强制转换MyObject as IDispatch,编译通过。
但是问题又出现了,只要前面执行过MyObject as IDispatch操作,那么
在执行MyObject.free 的时候,便会出错。
错误内容大概是说不能这样释放一个IDispatch。
各位大哥救我。

II)另一件令我感到奇怪的事情是:
前面我所说的“类没有注册”错误,并不是什么时候都会出现的。我从
Internet网上Down的一个例子程序(for Delphi 3.0),和我写的一样,但是他就
能跑。后来我自己也成功过,但是这样的事却不能重复。
 
既然如此,你为什么不"学习"Delphi中创建实例的语句,用:

var
MyObject:Variant;

...
MyObject:=CreateComObject(Class_MyOleSvr) as IMyOleSvr;

...
MyObject:=UnAssigned;

我这样测试没发现什么异常,不知是否合乎你的要求?
 
奇怪了,Dwwang大哥,我用你的方法作了,结果与我第一次描述的情况
一样.如果选择ciInternal会有“类没有注册”如果是cisingleInstance
或是cimultiinstance退出的时候,会出现上面所述的现象。

其实,我调用的CoTMyobject.create
他的实际上就是:
class function CoMyObject.Create: IMyObject;
begin
Result := CreateComObject(CLASS_My) as IMy;
end;
结果应该是一样的。
我是在Delphi4.0下,编写的该程序。
dwwang大哥,把你的程序寄给我,好吗?
我的地址:Lixin1@263.net
 
邮件已寄出,我什么也没加,就是生成了Automation Object,
然后加了那两句话,似乎没错。
我正好要出差,还有几个想法来不及多写了(立刻要去睡觉)
这个问题很有意思,一定要讨论清楚,
我会尽可能在外地上网的! ^_^

Bye.
 
感谢Dwwang大哥,谢谢所有帮助过我的人
 
后退
顶部