我有一个带有返回 Variant 的函数的 VB6 ActiveX DLL。Variant 包含一个节点变量数组,每个变量包含一个字符串名称和两个数据数组(字符串和双精度)。我正在尝试通过 JNI 将其作为作业对象返回给 Java 程序。
我可以通过调用适当的 VB 函数并将 Variant 结果存储为 SAFEARRAY 来访问外部节点数组。它可以访问维度并获得下限和上限。但是,我无法通过 SafeArrayGetElement() 或 SafeArrayAccessData() 访问每个节点。我总是得到一个无效的参数异常。
1) 我可以将 SAFEARRAY (或 VARIANT) 直接传递或强制转换为作业对象,而无需遍历 C++ 中的节点吗?
2) 我是否使用了错误的参数来获取 SAFEARRAY 数据?是否需要预先分配访问指针(var)的大小?
SAFEARRAY* outarr = t->VBFunction(&bstrparam).GetVARIANT().parray;
//Returns correct dimension (1)
printf("JNI GetNodes_States: Got array, dimension %d\n", outarr->cDims);
//Returns correct bounds
LONG lBound, rBound;
SafeArrayGetLBound(outarr, 1, &lBound);
SafeArrayGetUBound(outarr, 1, &rBound);
printf("JNI GetNodes_States: Bounds [%d, %d]\n", lBound, rBound);
//Returns Invalid Argument error (hresult=0x80070057)
//Gets first element
LONG* indexArray = new LONG[outarr->cDims];
for(unsigned short i=0; i<outarr->cDims; ++i)
indexArray[i] = 0;
_variant_t var;
hresult = SafeArrayGetElement(outarr, indexArray, (void*)&var);
if (SUCCEEDED(hresult)){
printf( "JNI GetNodes_States: %s, %d\n", "", outarr->cDims);
}
else {
printf( "JNI GetNodes_States Access Error:%X\n", hresult);
outobj = NULL;
}
delete[] indexArray;