在Borland C++环境下如何调用COM组件

wdjust 2013-01-22 11:01:23
大家好:
最近需要在Borland C++环境下调用客户提供的COM组件,查阅了一些资料,多是VC环境下调用的,Borland C++ Builder环境中可以在project中import新增,但是我用的这个Borland C++环境没有这个选项。请各位帮忙看看,不胜感激.

小弟内网无法上传图片,如需截图可以留下您的邮箱,我可以邮件发送。麻烦了,谢谢
...全文
222 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
wdjust 2013-01-31
  • 打赏
  • 举报
回复
引用 14 楼 redleaves 的回复:
IID_IClassFactory就是IClassFactory接口的IID IClassFactory的定义在微软的SDK里有.IID的定义也有.看下MSDN吧
还是不太会,我先好好学学吧,谢谢您了,分给您吧谢谢。还有并口通讯。。愁死了
redleaves 2013-01-28
  • 打赏
  • 举报
回复
IID_IClassFactory就是IClassFactory接口的IID IClassFactory的定义在微软的SDK里有.IID的定义也有.看下MSDN吧
wdjust 2013-01-28
  • 打赏
  • 举报
回复
引用 12 楼 redleaves 的回复:
你应该了解一下COM的基础知识.这样的话,这个问题就很容易解决了.

com库中对象的最基本创建方式就是通过DllGetClassObject得到类工厂,再通过类工厂得到不同类的接口指针.
STDAPI DllGetClassObject( REFCLSID rclsid, REFIID riid, PPVoid ppv );
这是最这个函数的定义.
rclsid是要创建的类的类工厂ID……

您好:
我看了下COM组件的相关资料,要创建的类的CLSID应该是GUID,IID_IClassFactory是接口,(void**)&class_factory 是返回的存放类厂对象的接口指针。IID_IClassFactory是接口具体指的是什么?例如我这个DLL中提供有一个接口见图片,对应的该接口的IID是什么呢?谢谢
redleaves 2013-01-25
  • 打赏
  • 举报
回复
你应该了解一下COM的基础知识.这样的话,这个问题就很容易解决了. com库中对象的最基本创建方式就是通过DllGetClassObject得到类工厂,再通过类工厂得到不同类的接口指针. STDAPI DllGetClassObject( REFCLSID rclsid, REFIID riid, PPVoid ppv ); 这是最这个函数的定义. rclsid是要创建的类的类工厂ID riid是返回的接口类型ID ppv是返回的接口指针 这个函数能得到IClassFactory类型的一个指针. 而这个类型的接口有一个Method(HRESULT) CreateInstance( IUnknown *pUnkOuter, REFIID riid, void **ppvObject)成员函数. 这个方法就是用来创建具体对象的. 大致代码结构如下:
typedef HRESULT (__stdcall* _DllGetClassObject_t)( REFCLSID rclsid, REFIID riid, PPVoid ppv );
HMODULE mod = (HMODULE)LoadLibrary( "xxx.dll" );
_DllGetClassObject_t get_ifactory = (_DllGetClassObject_t)GetProcAddr( mod, "DllGetClassObject" );
IClassFactory *class_factory;
if ( get_ifactory( 要创建的类的CLSID, IID_IClassFactory, (void**)&class_factory ) !=S_OK ) {
  // 创建失败
}
你的接口类型 * obj_interface;
if ( class_factory->CreateInstance( 0, IID_要创建的类的接口IID,(void**)&obj_interface ) != S_OK ) {
  // 创建失败
}
//后面就可以用obj_interface了
上面只是示意,引用计数要仔细处理
wdjust 2013-01-25
  • 打赏
  • 举报
回复
引用 10 楼 redleaves 的回复:
都直接拿到DLL了,还注册个什么劲儿啊.. 直接DllGetClassObject得到ClassFactory,再CreateInstance就OK了...
您好,小弟初学,您的意思是,像调用动态库那样调用其中的DllGetClassObject函数就可以了吗?能稍微详细点吗?非常感谢。谢谢谢谢,小弟小白初来乍到,这个问题折磨好久啦
redleaves 2013-01-25
  • 打赏
  • 举报
回复
都直接拿到DLL了,还注册个什么劲儿啊.. 直接DllGetClassObject得到ClassFactory,再CreateInstance就OK了...
图灵狗 2013-01-25
  • 打赏
  • 举报
回复
比如你的函数是int add(int a, int b),那么可以这样: typedef int (*FREG)(int, int); FREG lpfunc = (FREG)::GetProcAddress( hDLL,"DllRegisterServer");
引用 8 楼 wdjust 的回复:
引用 7 楼 turingo 的回复:FREG是你自己函数指针的类型,比如typedef int (*FREG)(int, int); 引用 6 楼 wdjust 的回复: 引用 5 楼 turingo 的回复:试试(http://www.cnblogs.com/songsu/articles/1334986.html)的方法。您好我试了下: void __fa……
wdjust 2013-01-25
  • 打赏
  • 举报
回复
引用 7 楼 turingo 的回复:
FREG是你自己函数指针的类型,比如typedef int (*FREG)(int, int); 引用 6 楼 wdjust 的回复: 引用 5 楼 turingo 的回复:试试(http://www.cnblogs.com/songsu/articles/1334986.html)的方法。您好我试了下: void __fastcall TForm1::ComBtnClick(TObje……
您好,非常感谢。另外 lpfunc是如何定义的呢?谢谢
wdjust 2013-01-22
  • 打赏
  • 举报
回复
图灵狗 2013-01-22
  • 打赏
  • 举报
回复
FREG是你自己函数指针的类型,比如typedef int (*FREG)(int, int);
引用 6 楼 wdjust 的回复:
引用 5 楼 turingo 的回复:试试(http://www.cnblogs.com/songsu/articles/1334986.html)的方法。您好我试了下: void __fastcall TForm1::ComBtnClick(TObject *Sender) { AnsiString dllPath = ExtractFilePat……
wdjust 2013-01-22
  • 打赏
  • 举报
回复
引用 5 楼 turingo 的回复:
试试(http://www.cnblogs.com/songsu/articles/1334986.html)的方法。
您好我试了下: void __fastcall TForm1::ComBtnClick(TObject *Sender) { AnsiString dllPath = ExtractFilePath(Application->ExeName) + "MyAtl.dll"; HMODULE hDLL = ::LoadLibrary( dllPath.c_str() );// 动态装载组件 if(hDLL) { FREG lpfunc = (FREG)::GetProcAddress( hDLL,"DllRegisterServer"); // 取得注册函数指针 // 如果是反注册,可以取得"DllUnregisterServer"函数指针 if ( lpfunc )lpfunc(); // 执行注册。这里为了简单,没有判断返回值 ::FreeLibrary(hDLL); ShowMessage("注册组件成功!"); } 提示FREG未定义,这个是需要包含头文件吗?网上没找到,谢谢
图灵狗 2013-01-22
  • 打赏
  • 举报
回复
试试(http://www.cnblogs.com/songsu/articles/1334986.html)的方法。
wdjust 2013-01-22
  • 打赏
  • 举报
回复
引用 3 楼 zhao4zhong1 的回复:
Spy4Win的作者应该是C++Builder的达人。
请问怎么能联系到他呢
赵4老师 2013-01-22
  • 打赏
  • 举报
回复
Spy4Win的作者应该是C++Builder的达人。
wdjust 2013-01-22
  • 打赏
  • 举报
回复
在线求解答~

3,882

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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