c++ - 0x80020009 OLE 异常访问除 0 以外的任何数字

标签 c++ com ole

所以我正在使用 COM 访问第三方程序,我使用以下方法从服务器获取属性:

HRESULT ConnectToHYSYS::OLEMethod(int nType, VARIANT * pvResult, IDispatch * pDisp, LPOLESTR ptName, int cArgs...){
if (!pDisp) return E_FAIL;

va_list marker;
va_start(marker, cArgs);

DISPPARAMS dp = { NULL, NULL, 0, 0 };
DISPID dispidNamed = DISPID_PROPERTYPUT;
DISPID dispID;
char szName[200];


// Convert down to ANSI
WideCharToMultiByte(CP_ACP, 0, ptName, -1, szName, 256, NULL, NULL);

// Get DISPID for name passed...
HRESULT hr = pDisp->GetIDsOfNames(IID_NULL, &ptName, 1, LOCALE_USER_DEFAULT, &dispID);
if (FAILED(hr)) {
    return hr;
}
// Allocate memory for arguments...
VARIANT * pArgs = new VARIANT[cArgs + 1];
// Extract arguments...
for (int i = 0; i < cArgs; i++) {
    pArgs[i] = va_arg(marker, VARIANT);
}

// Build DISPPARAMS
dp.cArgs = cArgs;
dp.rgvarg = pArgs;

// Handle special-case for property-puts!
if (nType & DISPATCH_PROPERTYPUT) {
    dp.cNamedArgs = 1;
    dp.rgdispidNamedArgs = &dispidNamed;
}

// Make the call!
hr = pDisp->Invoke(dispID, IID_NULL, LOCALE_SYSTEM_DEFAULT, nType, &dp, pvResult, NULL, NULL);
if (FAILED(hr)) {
    return hr;
}

// End variable-argument section...
va_end(marker);
delete[] pArgs;
return hr;

当我尝试通过以下方法访问 Collection 中的对象时:

void ConnectToHYSYS::GetMaterialStream(int index) {
HRESULT hr;
VARIANT result;
VariantInit(&result);
hr = OLEMethod(DISPATCH_PROPERTYGET, &result, hyStreams, L"Item", 1, index);
CheckForHr(hr);
hyStream = result.pdispVal;}

只有当index=0时才返回hyStream成员;我检查了以下内容: 1- hyStreams(集合)指针不为 NULL 2- 索引为 Im 的成员试图访问存在(该集合有 36 个 hyStreams 但无法获得索引大于 0 的任何 hyStream) 3- 调试时,调用时发生错误

hr = pDisp->Invoke(dispID, IID_NULL, LOCALE_SYSTEM_DEFAULT, nType, &dp, pvResult, NULL, NULL);

Where hr returns above mentioned error...

你能找出问题出在哪里吗? 谢谢

最佳答案

问题出在传递的类型(索引类型)上,我认为通过 COM 的所有类型都必须是 b 类对象.. 无论如何,将其更改为 _variant_t 并包括(没有它,你会遇到严重的错误链接和东西),问题解决了,我可以遍历整个集合。

关于c++ - 0x80020009 OLE 异常访问除 0 以外的任何数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40790135/

相关文章:

c++ - gcc-4.9 未定义行为清理器

c++ - 创建用于检索字符串 vector 的语法

c# - C++ 程序在调用 C# 接口(interface)时接收 HOST_E_CLRNOTAVAILABLE

com - 如何在命令行上从 COM exe 中提取 TypeLib

java - 如何在使用帮助 2003 打开 docx 文件时隐藏确认转换对话框

perl - 为什么 Perl 和 Word VBA 中的 Word 文档页数不同?

delphi - TWebBrowser-试图修复“无效的浮点运算”错误

C++:将引用作为参数传递,但该函数不接受引用作为参数

c++ - 如何重新分配全局变量c++

java - 无法共同创建对象/找不到名字对象 |雅各布