使用IDispatch的c++和COM的类似动态的替代方案
Dynamic-like alternative for C++ and COM using IDispatch
我正在向一位同事展示如何使用Microsoft ATL库轻松地在c++中创建和使用COM对象。特别是,我想使用演示IDispatch
来展示如何使用它来动态调用方法。然而,我并不经常使用c++/ATL,以免迷失在ATL的模板和方便方法和类中。
我们创建了一个小型COM类MyCOMLibrary.SimpleClass
,它有一个名为AppendMessage
的方法,该方法取2个BSTR
s,并且没有返回值。
从一个简单的Win32控制台应用程序,创建和使用COM对象是很容易的:
CComPtr<IDispatch> simpleClass;
debugPrint.CoCreateInstance(L"MyCOMLibrary.SimpleClass");
if (simpleClass) {
CComVariant vModule(L"Demo");
CComVariant vMessage(L"Welcome to COM");
simpleClass.Invoke2(L"AppendMessage", &vModule, &vMessage);
}
虽然这使得创建和管理COM对象几乎没有痛苦(特别是与使用DISPPARAMS
相比),但我正在寻找一种更简洁的方式来调用AppendMessage
方法,以反映现代c++/ATL/COM的使用(在VS 2012中)。
dynamic
关键字(动态文档)(或任何其他"后期绑定"语言,如JavaScript/VB6/等):
simpleClass.AppendMessage(L"Demo", L"Welcome to COM");
或者,没有这个,这将是更可读的:
simpleClass.Invoke2(L"AppendMessage", L"Demo", L"Welcome to COM");
然而,我知道第一个不会编译,因为该方法不存在于CComPtr<IDispatch>
上,第二个不会编译,因为Invoke2
需要VARIANT
s。
我确实尝试过直接使用接口作为比较:
// workaround VS2012 intellisense issue with #import
#ifndef __INTELLISENSE__
#import "progid:MyCOMLibrary.ISimpleClass" version("1.0")
#else
#include "DebugMyCOMLibrary.tlh"
#endif
CComPtr<MyCOMLibrary::ISimpleClass> simpleClass;
simpleClass.CoCreateInstance(L"MyCOMLibrary.ISimpleClass");
if (simpleClass) {
CComBSTR module(L"Interfacing");
CComBSTR message(L"And, then, there was COM.");
simpleClass->AppendMessage((BSTR)module, (BSTR)message);
}
但是,它几乎与原始版本相同(而且,我想做后期绑定)。
是否有一种不同的/更短的/更好的/很棒的方式来调用AppendMethod
使用IDispatch
和ATL,这将进一步打动我的同事,c++并不总是困难的?(或者,没有ATL的更好的方法也可以)。
看一看matthew wilson的《VOLE》
在http://vole.sourceforge.net/
它认为它做你想要的。我以前用过它,它使IDispatch客户端编程变得轻而易举。
查看http://www.codeproject.com/Articles/19962/Driving-Microsoft-Word-using-VOLE,查看使用Microsoft World
- 运行同一解决方案的另一个项目的项目
- std::向量与传递值的动态数组
- 在c++中用vector填充一个简单的动态数组
- 自上而下的动态规划与递归朴素解决方案.检查运行时执行
- C++中TSP的动态编程解决方案
- 向一系列指针及其替代方案的动态分配
- 我该如何判断k-server动态解决方案的最佳路径以数组成本[i] [j] [k] [t]位于何处
- 具有模板化类型的动态类型Singleton.这是可行的方法吗?[提供的解决方案]
- 迭代解决方案作为动态编程
- 动态铸造的替代方案
- 如何验证竞争性编程任务的动态编程解决方案的正确性
- 可调整大小的动态二维阵列的更好解决方案
- 用于动态分配数组的unique_ptr替代方案
- 具有对齐成员的对象的动态分配-可能的解决方案
- 递归解决方案的动态编程解决方案
- 使用动态编程进行更改的所有解决方案
- 动态规划解决方案-如何解决?(给我指个正确的方向)
- 针对不相关类型的动态调度的解决方案
- 使用IDispatch的c++和COM的类似动态的替代方案
- 动态内存分配:当最右边的维度是可变的时,二维数组的替代方案是什么