同感!
Automation 好象是OLE,产生的.DLL能以CreateOleObject()方式调用,
这COM产生的.DLL,却不能以CreateOleObject()方式调用,说接口不支持,
我也搞不懂了,这COM 不兼容原来的 OLE ?!
Automation 好象是OLE,产生的.DLL能以CreateOleObject()方式调用,
这COM产生的.DLL,却不能以CreateOleObject()方式调用,说接口不支持,
我也搞不懂了,这COM 不兼容原来的 OLE ?!
COM对象必须显示的调用。而自动化对象可以隐式的调用。
因为 Automation 实现了 IDispatah 接口,所以她支持高级的按名字调用的约定(当然,在内部她做了转换,最终还是通过指针调用,灵活方便得到了加强,牺牲了性能),因为 VB 不支持指针,所以 VB 不能使用 COM 对象。但是单纯的 COM 对象太原始了,几乎不能直接用来做大事。
For the definition of the IUnknown interface and its methods' ueryInterface, AddRef, and Release 梥ee the Microsoft online Help.
The IUnknown interface is the OLE interface from which AVIFile and AVIStream interfaces are derived. Interfaces used with AVI files rely on definitions of the QueryInterface, AddRef
, and Release methods from this interface.
======================================================= IDispatch InterfaceImplemented by Used by Header filename
Applications
that expose
programmable objects. Applications
that access
programmable objects. OLEAUTO.H (32-bit systems)DISPATCH.H (16-bit systems)
OLE Automation objects may implement the IDispatch interface for access by OLE Automation controllers, such as Visual Basic. The object's properties and methods can be accessed using IDispatch::GetIDsOfNames and IDispatch::Invoke.
The following examples show how to access an OLE Automation object through the IDispatch interface. Note that the code is abbreviated and omits error handling.// Declarations of variables used
DEFINE_GUID(CLSID_Hello, //...portions omitted for brevity...
HRESULT hresult;
IUnknown * punk;
IDispatch * pdisp;
OLECHAR FAR* szMember = "SayHello";
DISPID dispid;
DISPPARAMS dispparamsNoArgs = {NULL, NULL, 0, 0};
EXCEPINFO excepinfo;
UINT nArgErr;
但如果用的是非面像对像语言如 VB, VBA(总之是VB什么的多一些), 或是没有得COM对像的 TypeLibrary时, 这时不支持双重接口的COM对像就没有意义。Automation只是在原 COM对像上加个外衣,也就是说VTable映射由 IDispatch接口实现
CreateComObject()
就本地COM组件时,两个函数是通用的。COM对像的 CLS_ID要用 ProgIDTOClassID得到,这函数好像只有 Borland才有, MS不知用什么东东
CreateComObject没有CreateOleObject简单,主要要什么 怪参数,没法试.
ole有个类名如 "Excel.Application"等,
这COM是不是没有这个"类名",所以就不能CreateOleObject("类名");typedef System::DelphiInterface< IUnknown > _di_IUnknown;
extern PACKAGE _di_IUnknown __fastcall CreateComObject(const GUID &ClassID);
怪参数多烦呀
这多难受呀
ProgID又是啥东东,一脑子浆糊呀
var
aaa : IUnknown;
bbb : OleVariant;
begin
aaa := CreateComObject(StringtoGUID('{00024500-0000-0000-C000-000000000046}')) ;//这是Excel
bbb := aaa As IDispatch;
bbb.workBooks.open('D:\Temp\aaaa.xls');
ShowMessage(bbb.workbooks.Item[1].sheets.Item[1].Cells[1,1].text);//显示aaaa.xls中第一个网格的字符串
bbb.quit;
bbb := null;
end;
如何改成C++builder5.0,我试不成功!
{
IUnknown * aaa=CreateComObject(ProgIDToClassID("COMSERVER.GOOD"));
OleVariant bbb=(IDispatch *)aaa;
bbb.Exec(Function("Say")<<"Hello,3333!"); // 这一句执行结果不对
}
{
IUnknown * aaa=CreateComObject(ProgIDToClassID("COMSERVER.GOOD"));
OleVariant bbb=(IDispatch *)aaa;
bbb.Exec(Procedure("Say")<<"Hello,3333!");
}
是不是缺少对象初始化?
To lixia01: 如你没有ClassID或ProgID,怎样标识这个COM. 不过ClassID与ProgID之间的转换,Delphi提供了两个函数.ProgIDToClassID,ClassIDToProgID
方便了动态绑定,Automation是很重要的com扩展,这样com组件就可以跨语言调用,特别是
脚本语言,如VBA等。
推荐你看一本书《COM原理与应用》(潘爱民 著,清华大学出版社出版)
直接看COM的书可能要化比较多的时间。你可以看Delphi关于COM方面的书。
我觉得《Delphi4编程技术内幕》(Charlie Calvert著)是Delphi书籍中关于COM讲得最好的!
其它方面也很优秀,你一定会喜欢这本书的!
下列可能缺少类初始化部分,运行时出怪提示,算了,这种老实的过时方法不采用了,
现在用类型库定义 _TLB.cpp 更简单了
IUnknown * aaa=CreateComObject(ProgIDToClassID("COMSERVER.GOOD"));
OleVariant bbb=(IDispatch *)aaa;
bbb.Exec(Procedure("Say")<<"Hello,3333!"); //出现怪提示
就可以让任何一种语言来调用,大概是这个意思,详细的可以去看看李维的
ado/mts/com+