• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >vc/mfc > 如何调用COM组件?新手请大家帮忙

如何调用COM组件?新手请大家帮忙

作者:佚名 字体:[增加 减小] 来源:互联网 时间:2017-06-04

佚名通过本文主要向大家介绍了c#调用com组件,com组件调用,java调用com组件,qt调用com组件,vb调用com组件等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: 如何调用COM组件?新手请大家帮忙
描述:

VB代码:
  Set APIRoot = CreateObject("APIRootObj.APIRootObj")
  APIRoot.ServerIP="127.0.0.1"
  APIRoot.ServerPort="8006"
请问在VC中如何使用?


解决方案1:

吓死你:
void Test();
int main()
{
::CoInitialize( NULL ); // COM 初始化
Test();
::CoUninitialize(); // 释放 COM
return 0;
}
void Test()
{
wchar_t szProgID[] = L"APIRootObj.APIRootObj";
BSTR szServerIP; //= L"127.0.0.1";
BSTR szServerPort; //= L"8006";
wchar_t szOpServerIP[] = L"ServerIP";
wchar_t szOpServerPort[] = L"ServerPort";
szServerIP = SysAllocString (L"127.0.0.1");
szServerPort = SysAllocString (L"8006");
CLSID clsid; // 通过 ProgID 得到 CLSID
HRESULT hr = ::CLSIDFromProgID( szProgID, &clsid );
assert( SUCCEEDED( hr ) ); // 如果失败,说明没有注册组件
IDispatch * pDisp = NULL; // 由 CLSID 启动组件,并得到 IDispatch 指针
hr = ::CoCreateInstance( clsid, NULL, CLSCTX_ALL, IID_IDispatch, (LPVOID *)&pDisp );
assert( SUCCEEDED( hr ) ); // 如果失败,说明没有初始化 COM
//设置属性 1
LPOLESTR pwFunName = szOpServerIP; // 准备取得 Add 函数的序号 DispID
DISPID dispID; // 取得的序号,准备保存到这里
hr = pDisp->GetIDsOfNames( // 根据函数名,取得序号的函数
IID_NULL,
&pwFunName, // 函数名称的数组
1, // 函数名称数组中的元素个数
LOCALE_SYSTEM_DEFAULT, // 使用系统默认的语言环境
&dispID ); // 返回值
assert( SUCCEEDED( hr ) ); // 如果失败,说明组件根本就没有 ADD 函数
//构造参数
/*
VARIANTARG v[2]; // 调用 Add(1,2) 函数所需要的参数
v[0].vt = VT_I4; v[0].lVal = 2; // 第二个参数,整数2
v[1].vt = VT_I4; v[1].lVal = 1; // 第一个参数,整数1
*/
 
VARIANTARG v[1];
v[0].vt = VT_BSTR;
v[0].bstrVal = szServerIP;
DISPPARAMS dispParams = { v, NULL, 1, 0 }; // 把参数包装在这个结构中
VARIANT vResult; // 函数返回的计算结果
hr = pDisp->Invoke( // 调用函数
dispID, // 函数由 dispID 指定
IID_NULL,
LOCALE_SYSTEM_DEFAULT, // 使用系统默认的语言环境
DISPATCH_PROPERTYPUT, // 调用的是属性
&dispParams, // 参数
&vResult, // 返回值
NULL, // 不考虑异常处理
NULL); // 不考虑错误处理
assert( SUCCEEDED( hr ) ); // 如果失败,说明参数传递错误
/*
CString str; // 显示一下结果
str.Format("1 + 2 = %d", vResult.lVal );
AfxMessageBox( str );
*/
SysFreeString (szServerIP);
SysFreeString (szServerPort);
pDisp->Release(); // 释放接口指针
}

解决方案2:

http://www.vckbase.com/document/viewdoc/?id=1493
COM组件设计与应用(四)
简单调用组件
杨老师 个人专栏http://www.vckbase.com/vckbase/columnist/yangfeng/

解决方案3:

对于组件的调用有三种方式:
1。第一种是最原始的调用,采用CoGetClassObjec()或者CoCreateInstance()
它需要对象ID,接口ID,进程类型:(CLSCTX_LOCAL_SERVER ClSCTX_INPROC_SERVER CLSCTX_REMOTE_SERVER),如果聚合还需要外部接口指针,接口指针。
2。第二种是采用智能接口指针,需要导入tlb或者dll,例如IRootPtr,Ptr是在接口的基础上添加的,从而成为智能指针,IRootPtr.CreateInstance(ID或者对象名称);__uuidof(Root)
3.采用包装类的形式,通过VC导入Dll或者tlb生成包装类,进而进行调用。

解决方案4:

呵呵,常用的调用DLL也算调用COM组件吧
那第三种就可分为loadlibrary getAddress Freelibrary 和#pragma comment(lib, "****.lib");啦


分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • COM内部调用其它COM事件的问题,来者有分
  • 如何调用COM组件里的事件?
  • 调用自建的COM时出错
  • COM的调用问题,来解决一下
  • 调用COM的dll中的函数
  • 十万火急,VCNET调用COM的问题
  • 请问如何在c#中使用自己编写的COM组件
  • 在C#中怎样实现COM连接点事件处理?
  • 在C#中怎样实现COM连接点事件处理?
  • COM+组件调用时间不断增长问题?

相关文章

  • 2017-06-04 组件被聚合时调用的奇怪问题
  • 2017-06-05 如何在线程中设置窗口中某个Edit控件的焦点?详情请入内:
  • 2017-06-05 多线程中使用队列的问题??
  • 2017-06-04 VC操作Powerpoint
  • 2017-06-05 请教一个关于在服务里设置定时器的问题
  • 2017-06-04 请教怎样用excel9类型库写excel文件中的label?
  • 2017-06-04 ATL70中如何获取资源句柄
  • 2017-06-04 如何在安装时注册组件??
  • 2017-06-05 ATL写的ActiveX控件怎么在VB运行啊?
  • 2017-06-05 用Detours来HookAPI时,如何去Hook不同DLL中的同名的API呢

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • COM组件调用问题!
    • DBGrid大小如何跟随FormView改变
    • 请问哪位知道cdecl,declspec的英文全称及declspec的意思吗?
    • 多线程程序的调试问题?
    • 用atl和ado做了个数据库控件,我想用MicrosoftDataGrid控件显示查询结果,大虾们帮忙!!
    • "自动化"这个概念和"实现IDispatch接口"有什么关系
    • 请教:将已存在MFC工程封装到DLL的问题,使用AFX_MANAGE_STATEAfxGetStaticModuleState仍无效
    • 线程向主窗口发送消息出错在线等
    • Activex控件更新问题
    • javascript调用Activex函数设置传出参数

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有