请问两个初级的 COM 编程问题(50分)

  • 主题发起人 主题发起人 yanyandt2
  • 开始时间 开始时间
Y

yanyandt2

Unregistered / Unconfirmed
GUEST, unregistred user!
[第一个]
当一个类继承了多个接口时,比如接口1和接口2,默认的是接口1,那么我如何
能调用接口2里的方法呢?
我如下调用:
const
IID: TGUID = '{42D4CAC2-C300-49A7-9448-37A3F086F4ED}';
var
test : OleVariant;
test2 : OleVariant;
begin
test := CoTTestCom.Create;
test.QueryInterface(IID,OleVariant);//这里编译出错
end;
错误信息是 [Error] main.pas(35): Type not allowed in OLE Automation call

[第二个]
如何在注册表中注册自己的COM呢?也就是说其他程序使用这个COM时,就不用
use 那些单元,直接使用 GUID 创建就可以了。
 
第一:
你的IID是谁的?
var
test2: IInterface2;
begin
...
test.QueryInterface(IID, test2);
...
end;
第二
继承自TInterfacedObject, 实现自己的接口.
 
上面有一段写错了

test.QueryInterface(IID,test2);//这里编译出错

这里的 IID 就是 第二个接口的。

wlmmlw,我用了你的方法,可是编译还是出
[Error] main.pas(35): Type not allowed in OLE Automation call
错误。

第二个问题的解决方法能详细点吗?
 
procedure TForm1.Button1Click(Sender: TObject);
var
MyObject:TMyObject;
MyObject2:TMyObject2;
Intf1:IMyInterface;
Intf2:IMyInterface2;
begin
MyObject:=TMyObject.Create;
MyObject.FDelgateObj:=TMyObject2.Create;
if Supports(MyObject,IMyInterface,Intf1) then
ShowMessage(Intf1.SayHello);
if Supports(MyObject,IMyInterface2,Intf2) then
ShowMessage(Intf2.SayHello2);
end;
 
谢谢 ZZHI,
不过去掉 MyObject.FDelgateObj:=TMyObject2.Create; 才能用

那么第二个问题该如何解决啊?
 
另外,我也想知道如何用 queryinterface 来使用另一个接口的方法?
 
看了 Supports 的代码,知道该如何用 QueryInterface 了

谁能告诉我第二个问题的答案啊?
 
用as更简单
queryInerface有点麻烦。
(ComObject as interface).functionname(...)
 
同意楼上的
 
as操作符快。
 
不是太明白你说的
假如一个实现类,两个接口:
你要是把一个接口定义为default
那么量一个接口对象直接创建就不行
因为它默认第一个接口必须
t1: 默认接口;
t2:另一个接口;
begin
t1:=实现类.create;
t1.方法;//可以用
//用接口2方法
t1.QueryInterface(第2个就口guid;t2);
t2.方法;//这时间可以用;
end;
 
后退
顶部