1

我向一位同事展示了使用Microsoft ATL 库在 C++ 中创建和使用 COM 对象是多么容易。特别是,我想使用演示IDispatch来展示如何使用它来动态调用方法。但是,我没有足够频繁地使用 C++/ATL,以免迷失在 ATL 的模板和便捷方法和类中。

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

从一个简单的 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 对象几乎没有痛苦(尤其是与 using 相比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>第二个不会编译为Invoke2requires VARIANTs。

我确实尝试过直接使用界面作为比较:

// 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);
}

但是,它几乎与原版相同(此外,我想做后期绑定)。

问题

是否有一种不同/更短/更好/很棒的调用AppendMethodusingIDispatch和 ATL 的方式可以进一步给我的同事留下深刻印象,即 C++ 并不总是很困难?(或者,没有 ATL 的更好方法也可以)。

4

1 回答 1

1

看看马修威尔逊的 VOLE。

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

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

查看http://www.codeproject.com/Articles/19962/Driving-Microsoft-Word-using-VOLE以了解使用 Microsoft World 的示例

于 2013-05-04T21:45:11.947 回答