使用IDispatch的C ++和COM的类似动态的替代方案

时间:2013-04-19 14:55:44

标签: c++ com atl

我向同事展示了使用Microsoft ATL library在C ++中创建和使用COM对象的难易程度。特别是,我想使用演示IDispatch来展示它如何用于动态调用方法。但是,我不经常使用C ++ / ATL来避免迷失在ATL的模板和便捷方法和类中。

我们创建了一个小型COM类MyCOMLibrary.SimpleClass,它有一个名为AppendMessage的方法,需要2个BSTR并且没有返回值。

从简单的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相比时),但我一直在寻找一种更简洁的方法来调用反映现代C ++ /的AppendMessage方法ATL / COM使用(在VS 2012中)。

最好的情况就像C#的dynamic关键字(dynamic documentation)(或任何其他“后期绑定”语言,如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 "Debug\MyCOMLibrary.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和ATL调用IDispatch的不同/更短/更好/更棒的方式,这将进一步打动我的同事C ++并不总是困难? (或者,没有ATL的更好方法也可以)。

1 个答案:

答案 0 :(得分:1)

马修威尔森看看VOLE。

它位于http://vole.sourceforge.net/

它认为它做你想要的。我以前使用它,它使IDispatch客户端编程变得轻而易举。

使用Microsoft World

查看http://www.codeproject.com/Articles/19962/Driving-Microsoft-Word-using-VOLE示例