关于c++中GetIDsOfNames与Invoke的使用~

最近在学习com接口,和A控件,当中有一个函数得到的值为一个LPDISPATCH指针,所以在这跟大家分享一下,怎么通过LPDISPATCH指针来调用com接口中的函数对象。

首先LPDISPATCH指向的是个com接口对象,我们可以先查到这个指针指向的接口它有哪些参数和方法,比如我这个!

由此可见它的指向的是一个IMXDRAWRESBUF接口,接着我们再查查其中有哪些方法,如下:

发现里面有很多函数,接下来我们选择用Atstring这个函数,先查找一下它的参数:参数如下:


这下就知道它的传入参数只需要一个,返回值也知道了,接下来我们将调用GetIDsOfNames函数来得到一个指向这个函数的指针。

具体方法如下:

	BSTR PropName[1];  
	DISPID PropertyID[1] = {0};  

	PropName[0] = SysAllocString(L"AtString");  

	HRESULT hr=a->GetIDsOfNames(IID_NULL, PropName, 1, LOCALE_USER_DEFAULT, PropertyID);

当中propName表示这个函数的名称,用DISPID变量Property来接受该函数的指针信息。

其中hr返回值可以帮助我们检索是否得到成功。

然后我们就可以用invoke函数来调用这个接口函数ATSTRING()啦

具体方法如下:

CComVariant avarParams[1];  
		LONG vTotal = i;  
		avarParams[0].vt = VT_LPSTR;  
		avarParams[0] = &vTotal;  
		CComVariant Result;

		DISPPARAMS params = { avarParams,  
			NULL,              // Dispatch identifiers of named arguments.   
			1,                 // Number of arguments.  
			0 };                // Number of named arguments.  
		;
		HRESULT hr2= a->Invoke(PropertyID[0],IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD,¶ms,&Result,NULL,NULL);
其中ReSULT是用来接收返回值的,invoke第一个变量就填我们刚才得到的Property,invoke中需要注意的是第四个参数,DISPATCH_METHOD表示你要找接口中的方法函数,如果填成DISPATCH_PROPERTYGET代表你要找该接口的属性,刚开始我就在这里翻了船,params代表着输入者,这样result的返回值就是我们需要的结果啦~


  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
因文件超过20M不能上传,所以拆分为两个文件分次上传 第1章 COM背景知识 1.1 COM的起源 1.1.1 软件业面临的挑战 1.1.2 传统解决方案 1.1.3 面向对象程序设计方法 1.1.4 最终解决方案:组件软件 1.1.5 面向对象的组件模型——COM 1.2 COM的发展历程 1.2.1 COM以前的对象技术:DDE、OLE 1、VBX控件 1.2.2 COM首次亮相:OLE2 1.2.3 Microsoft拥抱Internet:ActiveX 1.2.4 更多的新名词:Windows DNA和COM+ 1.2.5 远程对象:ORBs和DCOM 1.2.6 COM的最新版本:COM+ 1.3 COM技术现状 1.3.1 COM与CORBA 1.3.2 COM与Enterprise Java Beans 1.3.3 Windows之外的COM 小结 第2章 从C++到COM 2.1 C++客户重用C++对象——例程DB 2.1.1 C++对象 2.1.2 客户程序 2.2 将C++对象移进DLL——例程DB_cppdll 2.2.1 成员函数的引出 2.2.2 内存分配 2.2.3 Unicode/ASCII兼容 2.2.4 例程实现 2.2.4.1 修改接口文件 2.2.4.2 修改对象程序 2.2.4.3 修改客户程序 2.3 C++对象使用抽象基类——例程DB_vtbl 2.3.1 问题:私有数据成员被暴露 2.3.2 解决方案:抽象基类 2.3.2.1 什么是抽象基类(Abstract Base Class) 2.3.2.2 实现秘诀:虚函数(Virtual Functions) 2.3.3 使用抽象基类 2.3.4 例程实现 2.3.4.1 修改接口文件 2.3.4.2 修改对象程序 2.3.4.3 修改客户程序 2.4 改由COM库装载C++对象——例程dbalmostcom 2.4.1 COM库 2.4.2 对象创建的标准入口点 2.4.3 标准对象创建API 2.4.4 标准对象注册 2.4.5 例程实现 2.4.5.1 修改接口文件 2.4.5.2 修改对象程序 2.4.5.3 修改客户程序 2.5 将C++对象变成COM对象 2.5.1 引用计数 2.5.2 多接口 2.5.3 IUnknown接口 2.5.4 标准类厂接口:IClassFactory 2.5.5 对象代码的动态卸载 2.5.6 自动注册 2.5.7 例程实现 2.5.7.1 修改接口文件 2.5.7.2 修改对象程序 2.5.7.3 修改客户程序 2.6 为COM对象添加多接口支持 2.6.1 多接口 2.6.2 DEFINE_GUID 2.6.3 例程实现 2.6.3.1 修改接口文件 2.6.3.2 修改对象程序 2.6.3.3 修改客户程序 小结 第3章 COM基础知识 3.1 对象与接口 3.1.1 COM对象 3.1.2 COM接口 3.1.3 IUnknown接口 3.1.3.1 生存期控制:AddRef和Release 3.1.3.2 接口查询:QueryInterface 3.1.4 全球唯一标识符GUID 3.1.5 COM接口定义 3.1.6 接口描述语言IDL 3.2 COM应用模型 3.2.1 客户/服务器模型 3.2.2 进程内组件 3.2.3 进程外组件 3.2.4 COM库 3.2.5 HRESULT返回值 3.2.6 COM与注册表 3.3 COM组件 3.3.1 实现类厂对象 3.3.2 类厂对象的创建 3.3.3 实现自动注册 3.3.4 实现自动卸载 3.4 COM客户 3.4.1 COM对象创建函数 3.4.1.1 CoGetClassObject 3.4.1.2 CoCreateInstance 3.4.1.3 CoCreateInstanceEx 3.4.2 如何调用进程内组件 3.4.3 COM客户调用进程外组件 3.5 进一步认识COM 3.5.1 可重用机制:包容和聚合 3.5.2 进程透明性 3.5.3 安全性机制 小结 第4章 COM扩展技术 4.1 可连接对象机制 4.1.1 客户、接收器与可连接对象 4.1.1.1 接收器 4.1.1.2 可连接对象 4.1.1.3 客户 4.1.2 实现可连接对象 4.1.3 实现接收器 4.1.4 建立接收器与连接点的连接 4.1.5 获得出接口的类型信息 4.2 结构化存储 4.2.1 什么叫结构化存储和复合文件 4.2.2 存储对象和IStorage接口 4.2.2.1 IStorage接口 4.2.2.2 获得IStorage指针 4.2.2.3 释放STATSTG内存 4.2.2.4 枚举存储对象的元
以下是一个简单的示例,演示如何在C++代码使用PowerPoint的OMath对象: ```cpp #include <windows.h> #include <ole2.h> #include <office.h> int main() { // 初始化COM库 CoInitialize(NULL); // 创建PowerPoint应用程序对象 IDispatch* pApp = NULL; HRESULT hr = CoCreateInstance(CLSID_PowerPointApplication, NULL, CLSCTX_LOCAL_SERVER, IID_IDispatch, (void**)&pApp); if (SUCCEEDED(hr)) { // 打开PowerPoint文档 VARIANT vtFilename; VariantInit(&vtFilename); vtFilename.vt = VT_BSTR; vtFilename.bstrVal = SysAllocString(L"C:\\mypresentation.pptx"); IDispatch* pPresentations = NULL; hr = pApp->GetIDsOfNames(IID_NULL, &vtFilename.bstrVal, 1, LOCALE_USER_DEFAULT, &pPresentations); if (SUCCEEDED(hr)) { VARIANT vtIndex; VariantInit(&vtIndex); vtIndex.vt = VT_I4; vtIndex.lVal = 1; IDispatch* pPresentation = NULL; hr = pPresentations->Invoke(DISPID_VALUE, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYGET, &vtIndex, &pPresentation, NULL, NULL); if (SUCCEEDED(hr)) { // 获取OMath对象 IDispatch* pOMath = NULL; hr = pPresentation->GetIDsOfNames(IID_NULL, L"OMath", 1, LOCALE_USER_DEFAULT, &pOMath); if (SUCCEEDED(hr)) { // 调用OMath对象的方法和属性 // ... // 释放OMath对象 pOMath->Release(); } // 释放Presentation对象 pPresentation->Release(); } // 释放Presentations对象 pPresentations->Release(); } // 释放文件名 VariantClear(&vtFilename); } // 释放应用程序对象 pApp->Release(); // 关闭COM库 CoUninitialize(); return 0; } ``` 请注意,此示例仅演示了如何打开PowerPoint文档并获取OMath对象。要调用OMath对象的方法和属性,请参考Microsoft官方文档或者相关的开发手册。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值