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

Dynamic-like alternative for C++ and COM using IDispatch

本文关键字:动态 方案 COM IDispatch c++ 使用      更新时间:2023-10-16

我正在向一位同事展示如何使用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中)。

最好的情况是c#的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

的示例。