gpt4 book ai didi

c++ - 如何调用使用 IDispatch.Invoke 接收浮点值的函数?

转载 作者:可可西里 更新时间:2023-11-01 14:50:49 25 4
gpt4 key购买 nike

我在使用 IDispatch.Invoke 调用具有浮点参数和浮点结果的函数时遇到问题。

这是一个最小的复制:

#include <atlbase.h>
#include <comutil.h>

int main(int argc, char* argv[])
{
CoInitialize(NULL);
CComPtr<IDispatch> wordapp;
if (SUCCEEDED(wordapp.CoCreateInstance(L"Word.Application", NULL, CLSCTX_LOCAL_SERVER)))
{
CComVariant result;
CComVariant centimeters((float)2.0);
CComVariant retval = wordapp.Invoke1(L"CentimetersToPoints", &centimeters, &result);
}
return 0;
}

我正在使用 ATL CComPtr 使事情变得更清晰。但它是 IDispatch.Invoke 的一个非常松散的包装器。

当我运行它时,对 Invoke1 的调用失败并返回 E_FAIL

我怀疑问题与使用浮点参数和/或返回值有关。如果我调用一个不使用此类值的函数,则调用成功:

CComVariant retval = wordapp.Invoke0(L"ProductCode", &result);

我注意到,如果我从 VBS 或 PowerShell 调用该函数,它会成功。我假设他们都使用后期绑定(bind) IDispatch,所以这表明我正在尝试的至少是可能的。

那么,如何使用 IDispatch 调用此函数?

最佳答案

嗯,这是一个令人头疼的问题。这种“方法”的文档非常具有误导性,它不是一种方法。它的行为更像是一个索引属性,需要 DISPATCH_METHOD | DISPATCH_PROPERTYGET 标志。 CComPtr 不支持,您需要手动旋转它。此代码有效:

    CComVariant result;
CComVariant centimeters((float)2.0);
DISPID dispid;
LPOLESTR name = L"CentimetersToPoints";
HRESULT hr = wordapp->GetIDsOfNames(IID_NULL, &name, 1, LOCALE_USER_DEFAULT, &dispid);
assert(SUCCEEDED(hr));

DISPPARAMS dispparams = { &centimeters, NULL, 1, 0};
hr = wordapp->Invoke(dispid, IID_NULL, LOCALE_USER_DEFAULT,
DISPATCH_METHOD | DISPATCH_PROPERTYGET, &dispparams, &result, nullptr, nullptr);
assert(SUCCEEDED(hr));

关于c++ - 如何调用使用 IDispatch.Invoke 接收浮点值的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16285138/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com