Dav*_*nan 3 c++ windows winapi
使用时,我无法调用具有浮点参数和浮点结果的函数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", ¢imeters, &result);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我正在使用ATL CComPtr来使事情更清洁.但它是一个非常宽松的包装IDispatch.Invoke.
当我运行它时,调用Invoke1失败并返回E_FAIL.
我怀疑这个问题与使用浮点参数和/或返回值有关.如果我调用一个不使用这些值的函数,则调用成功:
CComVariant retval = wordapp.Invoke0(L"ProductCode", &result);
Run Code Online (Sandbox Code Playgroud)
我注意到,如果我从VBS或PowerShell调用该函数,它会成功.我假设他们都使用后期限制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 = { ¢imeters, NULL, 1, 0};
hr = wordapp->Invoke(dispid, IID_NULL, LOCALE_USER_DEFAULT,
DISPATCH_METHOD | DISPATCH_PROPERTYGET, &dispparams, &result, nullptr, nullptr);
assert(SUCCEEDED(hr));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
724 次 |
| 最近记录: |