没有类型库文件,但知道接口,可以调用COM吗(47分)

  • 主题发起人 主题发起人 吴剑明
  • 开始时间 开始时间

吴剑明

Unregistered / Unconfirmed
GUEST, unregistred user!
知道接口:
project1.myinterface
OLE就可以调用了。但是COM呢? 我觉得应该可以的。但我不会。我只会用有类型库的。
那个大虾给个DEMO?
 
>>OLE就可以调用了。但是COM呢?
这是什么意思?

MyObj:=CreateOleObject('Project1.MyClass');
MyClass.MyInterface;

有区别么?
 
老大:
调用COM啊,不是调用OLE啊。你那样做的话会提示“不支持该接口”的。:(
MyObj:=CreateCOMObject(ProgidToClassId( 'Project1.MyClass'));
MyClass.MyInterface;
也肯定不行啦。不同的东西。返回的是IUNKNOWN接口,而不是我的COM接口。
我现在希望能在程序中动态调用COM,人家给个接口如:'Project1.MyClass'
我就能调用它。OLE我做到了,但是COM做不到。没类型库就说我的接口没定义。
可要是先用了类型库,那就不叫“动态”了。:(



 
好象不行,因为COM必须知道自己的对象接口的GUID,而GUID又放在类型库中。
 
>>调用COM啊,不是调用OLE啊。你那样做的话会提示“不支持该接口”?

我想恐怕是你搞错了,Ole和COM有什么区别?

MyObj:Variant
begin
MyObj:=CreateOleObject('Project1.MyClass');
MyClass.MyInterface;
end;

或者:

MyObj:Variant
begin
MyObj:=CreateCOMObject(ProgIDtoClassID('Project1.MyClass')) as IDispatch;
MyClass.MyInterface;
end;

这是等价的,我想你需要的就是这句 "as IDispatch"吧,
但是出现“不支持该接口”,应该是你或者对方程序的问题。
 
我试了,
温老大的根本不行。。。
 
????
1、怎么不行,症状如何,具体代码,什么对象...
2、你有没有用别的对象试验过我上面的代码;
3、你的那个对象用静态 import TLB 就可以么?

老弟,你还是没听我的忠告,什么进一步的信息也不说,就指望别人继续讨论你的问题?
我这是最后一次提醒你了,最近我心情不太好...
 
温:
我不是说过了吗:提示“不支持该接口”
但是我用类型库的方法调用是一点问题也没有的。估计是这种方法调用不了
CreateComObject返回的不是我的接口,当然无法调用
MyClass.MyInterface;
除非用AS Imyinterface。但是这样的话一定要有类型库,否则提示“接口没有定义”
温老大,该知道我在说什么了吧?

 
唉!其实你不说我也知道了,因为我按照我提的那三个问题的思路又考虑了一下,
终于明白你说的是只实现IUnknown的接口,而没有实现IDispatch的接口的对象。
可是这可不是什么COM和OLE的区别,因为和两者根本没区别,我已经一再强调了。

说实话,您老提的问题水平还真的都挺高,可也不知道是什么原因,
其实您老对问题本身还都没理解清楚... ,因此表达能力比我也强不到哪去,
难怪误解这么多 :-)

言归正传,这个问题还真有一定难度,因为看样子Delphi的delay binding其实
只是实现了IDispatch的功能,也就是Ole Automation类型的对象,而对一般的
COM对象--IUnknown,没有提供这个能力。我也是思考你这个问题的时候才发现的。

这应该是编译器一级的事情,现在还没完全理清头绪,
等有时间的时候我再发掘发掘,看看这个问题应该怎么解释/解决。

对不起,最近我的状态真是出问题了,见人就吵,得罪之处,请见谅,
我准备找个凉快地方歇几天... :-(

 
多谢温老大,看来我还是要补补课才行了。:)
这个问题是否就是无解了呢?
 
我来也.如果是ASP可以调用的的必须是OLE自动控制对象.
 
com和ole是不一样的
ole实现了双重接口,可以用createoleobject通过名字调用
com不行的
com必须有类型申明才能用的
 
>>这个问题是否就是无解了呢?
暂时没想到办法,估计很难。

wrench和我说的一个意思,不过要我说那确实不是OLE和COM的区别,那只是两个名词而已。
应该是我上面说的那样,是OLE Automation对象和原生(Native)COM对象的区别。

另外,关于late binding,也有各家说法的不同,Delphi中就把TLB方式叫做early binding,
其实从编译的角度看,COM对象都应该算作late biding,别人好像也都是这么认为的。
我上面也是受了Delphi的传染,因此说它的late biding只支持IDispatch接口的。

因此,这个问题是IDispatch接口与原生IUnknown接口的两种late binding的区别,
而只有实现了双重接口的对象,就象wrench说的,才能使用前一种方式,
Native COM对象只能通过TLB方式,在编译阶段预先确定method ID,看样子你的问题... :-)
 
看来我只好昏倒。。。
 
呵呵,这两天正好在研究com

关于com和ole的区别,把很多人都搞糊涂过。
其实这个问题MS是有责任的。
ole开始出现的时候,是object linking and embdding
(对象链接与嵌入)的缩写,这种技术想必大家比较熟悉。
但是OLE 2推出的时候,又添加了两种技术,即
OLE Automation和OLE Controls,两位讨论的就是
OLE Automation。
原始意义上的object linking and embdding则
被定义成OLE Ducoments。
OLE2中的OLE已经不再是任何单词的缩写,而成为
了一个单独的名称,和它的原始意义没什么直接关系了。
后来MS又用ActiveX取代了OLE Controls,用
Active Ducoments取代了OLE Ducoments,用
单独的Automation取代了OLE Automation。
但老的定义和新的定义在同时使用,所以往往把人搞得
晕头转向……

COM(component object model组件对象模型)从定义
上来说是应用OLE技术的实现。但实际使用中OLE和COM往往
是通用的,表示的就是同一个意思……

createoleobject和createcomobject,我看不出和它们的
字面的意义有何直接关系。我知道的区别只在于,
createcomobject接受一个GUID类型的参数,返回一个
IUnknown类型,createoleobject接受服务器注册的名字
作为参数,返回一个IDispatch类型。
virians变量可以接受IDispatch类型的赋值,即使这个
IDispatch是未知的,因此象

MyObj:Variant;
begin
MyObj:=CreateOleObject('Project1.MyClass');
MyClass.MyInterface;
end;

这种方式是可以的,不需要类型库。
CreateCOMObject会返回一个IUnknown接口,这是不行的……
象这个:

MyInterface:IMyInterface;
begin
MyInterface :=CreateCOMObject(ProgIDtoClassID('Project1.MyClass')) as IMyInterface;
MyInterface.dosth;
end;

必须先首先知道IMyInterface的定义,否则无法编译,所以必须要个tlb
在Delphi中把前者称为滞后联编,因为编译时不知道接口的定义,
后者称为超前联编,必须预先知道接口的定义。

因此,要使用一个Automation对象,必须:
1、COM本身实现IDispatch接口,以便用Variant搞定;
2、如果只实现了IUnknown,那就给一个TLB;
3、TLB没有,那就从EXE文件或DLL文件中提取类型库;
(例如导入一个IE的ActiveX控件,会自动生成一个
.pas,提取了所有的接口)
4、如果提也提不出来,恐怕就莫得办法了……

俺对COM也是刚上手,不当之处请各位指教……

另外,Native COM这种说法我还是第一次听到
根据一刀所说,好象就是只实现了IUnknown接口
的COM对象
这种说法是哪来的,一刀能否详细解释一下?

 
我的理解:
实现了双重接口的com对象是ole automation 对象
 
to 左,你考证了历史,呵呵,差不多

wrench,我也是这么理解的,不矛盾。
 
要考试了
考完了再来讨论com的问题
 
感谢各位大虾指导。有茅舍顿开的感觉
 
多人接受答案了。
 
后退
顶部