IAutomation - 如何检索指针传递的参数值?
在.idl文件中写道:
interface IAutomation : IDispatch {
[id(0x000000e0), helpstring("Returns if the player is ready. Many of the other commands fail as long as the player is not ready.")]
HRESULT GetReady([out] VARIANT* Ready);
};
我想,GetReady() - 方法,而不是属性。
如果我尝试使用VOLE库:
object player = object::create("StereoPlayer.Automation", CLSCTX_LOCAL_SERVER, vole::coercion_level::valueCoercion);
VARIANT var;
::VariantInit(&var);
VARIANT pos = player.invoke_method(vole::of_type<VARIANT>(), L"GetReady", var);
但收到链接器错误:
error LNK2019: unresolved external symbol "public: static struct tagVARIANT __cdecl vole::com_return_traits<struct tagVARIANT>::convert(struct tagVARIANT const &,enum vole::coercion_level::coercion_level)" (?convert@?$com_return_traits@UtagVARIANT@@@vole@@SA?AUtagVARIANT@@ABU3@W4coercion_level@42@@Z) referenced in function "public: struct tagVARIANT __thiscall vole::object::invoke_method<struct tagVARIANT,struct tagVARIANT>(struct vole::of_type<struct tagVARIANT>,unsigned short const *,struct tagVARIANT const &)" (??$invoke_method@UtagVARIANT@@U1@@object@vole@@QAE?AUtagVARIANT@@U?$of_type@UtagVARIANT@@@1@PBGABU2@@Z)
调用其他无法返回的方法,效果很好。
我也尝试直接调用How To Use Visual C++ to Access DocumentProperties with Automation中描述的方法IDispatch :: Invoke() 。但是误解了回报的价值。
答案 0 :(得分:0)
我不熟悉VOLE,但如果我正确地阅读其源代码,则需要这样做:
VARIANT pos = player.invoke_method<VARIANT>(L"GetReady");
或者这个:
VARIANT pos = player.invoke_method(vole::of_type<VARIANT>(), L"GetReady");
您正尝试将VARIANT
作为[in]
参数传递给GetReady()
,但它没有此类参数。它改为[out]
参数,由invoke_method()
的返回值表示,因此您无需传入自己的VARIANT
参数。
invoke_method()
在内部执行VARIANT
- 类型的coersions,因此假设GetReady()
实际返回包含在VARIANT
中的布尔值,您甚至可以执行某些操作像这样:
VARIANT_BOOL ready = player.invoke_method<VARIANT_BOOL>(L"GetReady");
甚至:
bool ready = player.invoke_method<bool>(L"GetReady");