关于调用COM.......

conanfans 2002-08-15 04:10:42
我才开始学COM,在BCB6中建了一个很简单的例子,但是用import type library时,没有typedef TCoClassCreatorT<TCOMICOMObject, ICOMObject, &CLSID_COMObject, &IID_ICOMObject> CoCOMObject;这样的东西,我就没有办法用Creat()来新建了.
为什么会出现这样的情况呢?是写COM时的问题还是Import时的问题?如果不用Create那么又可以怎么调用这个COM呢?
...全文
41 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
conanfans 2002-08-30
  • 打赏
  • 举报
回复
OK.谢谢楼上的。
jacklondon 2002-08-28
  • 打赏
  • 举报
回复
比如我们要调用 Vampire 的 COM
1.Project -> import type library -> Vampire Library, 产生一个 Vampire_TLB.h
2.在cpp 文件中
#include "Vampire_TLB.h"
using namespace Vampire_tlb;
3.以下代码参数值我是随便传入的,仅做参考,一步一步 debug 可以看到 Vampire 打开和关闭的运行效果。

...
void __fastcall TForm1::Button1Click(TObject *Sender)
{
NewJobPtr pNewJobPtr;
pNewJobPtr.CreateInstance(WideString("Vampire.NewJob"));
pNewJobPtr->Initialize(WideString("http"),WideString("127.0.0.1"));
pNewJobPtr->Open(WideString("abc.zip"));
pNewJobPtr.Release();
}

...

jianlinlong 2002-08-27
  • 打赏
  • 举报
回复
建立bcb的 Automation 东东就可以加有最后一句了
conanfans 2002-08-27
  • 打赏
  • 举报
回复
请楼上的讲具体点好吗?
jacklondon 2002-08-26
  • 打赏
  • 举报
回复
CBuilder 6 学了VC6, import type library 后一般都有几个 ***Ptr,
***Ptr.CreateInstance(XXXX);
***Ptr->FunctionA();
...
***Ptr.Release();

不过使用COM编程还是VB功能最强大,数据类型不用转换,COM加入到project后,将可以使用COM里面的class,没有 .h 文件的烦恼,没有指针的烦恼。
CBuilder6最不应该的是import type library 将class 列表加入一大堆com class,CBuilder6 应该学学VC,让COM编程更加简单。
如果CBuilder6 在一年内达到VC的水平或者在三年内达到VB的水平我就可以自费请Borland 公司的人吃饭了
huzhangyou 2002-08-15
  • 打赏
  • 举报
回复
huzhangyou2002@163.com
huzhangyou 2002-08-15
  • 打赏
  • 举报
回复
也给我一个
我最近也在研究者东西
那本essential in com(不知道没有打错)真的很好
jishiping 2002-08-15
  • 打赏
  • 举报
回复
To kingcaiyao(AKing):
能给我一个COM的简单例子吗?我对COM一窍不通啊,谢谢。
我的E-Mail: jishiping@163.com
conanfans 2002-08-15
  • 打赏
  • 举报
回复
UP/
conanfans 2002-08-15
  • 打赏
  • 举报
回复
我想BCB6没有这么差吧.
kingcaiyao 2002-08-15
  • 打赏
  • 举报
回复
有这个可能,但我不可以肯定,我用的是BCB5.
CoderNO1 2002-08-15
  • 打赏
  • 举报
回复
BCB6就是这付德性(或者使用了另类的创建方法吧)。建议你手动把你要创建的对象一个一个地加入TCoClassCreatorT<TCOMICOMObject, ICOMObject, &CLSID_COMObject, &IID_ICOMObject> CoCOMObject;
给你一种简便的方法,先在BCB5中Import进来,然后把里面的CoXXXX全部COPY到BCB6的TLB中。
conanfans 2002-08-15
  • 打赏
  • 举报
回复
根本找不到那几个的声明(CoClassName ,***DISP等).但我看以前转换的文件却有.是不是BCB6使用了不同的方法调用COM?
kingcaiyao 2002-08-15
  • 打赏
  • 举报
回复
有这种可能,我用的是BCB5,上面我所说的方法我都实现过。
还想问一下,你到底出现什么错误?
conanfans 2002-08-15
  • 打赏
  • 举报
回复
ICOMObjectDisp app;
也不行.也没有ICOMObjectDisp这个定义.
我用的是BCB6, 是不是与以前的版本有区别?
conanfans 2002-08-15
  • 打赏
  • 举报
回复
我很想用第一种方法.但在TBL.H文件中,根本没有CoCOMObject这条定义,但在BCB5引入的H文件中就有.怎么回事呢?
kingcaiyao 2002-08-15
  • 打赏
  • 举报
回复
这样调用:
1.采用VTable口,速度较IDispatch接口快
void __fastcall TForm1::Button1Click(TObject *Sender)
{
TCOMICOMObject app=CoCOMObject::Create();
app->YourMethod defined in COM Inteface(Para1,.....);
}
2.采用IDispatch接口
void __fastcall TForm1::Button1Click(TObject *Sender)
{
ICOMObjectDisp app;
app.BindDefault();
app.YourMethod defined in COM Interface(Para1,.....);
}
3.采用万能对象
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Variant V=Variant::CreateObject("Your COM Object");
V.OleFunction(YourMethod defined in COM Interface,Para1,....);
}
第一次运行你的COM对象就会注册,那么在客户端程序调用COM对象,应该包含 *_TLB.h这个头文件,并且将类型库经编译后产生的目标文件obj加到你的项目中,然后选取上面我所说的三种方法中任何一种就可以调用。

13,874

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧