Com 使用JNI访问变体的安全阵列

Com 使用JNI访问变体的安全阵列,com,java-native-interface,variant,safearray,Com,Java Native Interface,Variant,Safearray,我有一个VB6 ActiveX DLL,其中包含返回变量的函数。该变量包含一个节点变量数组,每个节点变量都包含一个字符串名称和两个数据数组(字符串和双精度)。我试图通过JNI将其作为作业对象返回给Java程序 我可以通过调用适当的VB函数并将变量结果存储为SAFEARRAY来访问外部节点数组。它可以访问维度并获得上下限。但是,我无法通过SafeArrayGetElement()或SafeArrayAccessData()访问每个节点。我总是得到一个无效的参数异常 1)在不重复C++ + < /

我有一个VB6 ActiveX DLL,其中包含返回变量的函数。该变量包含一个节点变量数组,每个节点变量都包含一个字符串名称和两个数据数组(字符串和双精度)。我试图通过JNI将其作为作业对象返回给Java程序

我可以通过调用适当的VB函数并将变量结果存储为SAFEARRAY来访问外部节点数组。它可以访问维度并获得上下限。但是,我无法通过SafeArrayGetElement()或SafeArrayAccessData()访问每个节点。我总是得到一个无效的参数异常

1)在不重复C++ + < /P>节点的情况下,我可以直接将SAFEAREL(或变量)传递给JOBJET吗? 2) 我是否使用了错误的参数来获取SAFEARRAY数据?是否需要事先分配访问指针(var)的大小

SAFEARRAY*outarr=t->VBFunction(&bstrparam).GetVARIANT().parray;
//返回正确的维度(1)
printf(“JNI GetNodes\u状态:获取数组,维度%d\n”,outarr->cDims);
//返回正确的边界
长耳结缔组织,耳结缔组织;
安全阵列已绑定(向外、1和1绑定);
安全阵列ETUBOUND(出站、1号和B号);
printf(“JNI GetNodes\u状态:边界[%d,%d]\n”,lBound,rBound);
//返回无效的参数错误(hresult=0x80070057)
//获取第一个元素
LONG*indexArray=新的LONG[outarr->cDims];
for(无符号短i=0;icDims;++i)
指数[i]=0;
_变异变量;
hresult=安全阵列元素(outarr、indexArray、(void*)和var);
如果(成功(hresult)){
printf(“JNI GetNodes\u状态:%s,%d\n”,“”,outarr->cDims);
}
否则{
printf(“JNI GetNodes\u状态访问错误:%X\n”,hresult);
outobj=NULL;
}
删除[]索引数组;

1)在不重复C++ + < /P>节点的情况下,我可以直接将SAFEAREL(或变量)传递给JOBJET吗? 恐怕绝对不是。您将遍历该数组,提取所有必要的值,并将它们转换为Java能够理解的内容

2) 我是否使用了错误的参数来获取SAFEARRAY数据?是否需要事先分配访问指针(var)的大小

最可疑的参数是
indexArray
,每个维度都将其设置为0。但是,如果数组是由Visual Basic创建的,则很可能是基于1的数组而不是基于0的数组,这将使索引0非法


这就是为什么元素提取代码需要注意
safearraygetbound
SafeArrayGetUBound

出于好奇,
safearraygetbound
SafeArrayGetUBound
报告的边界是什么?对于9项长的数组,返回的边界是0和8;我甚至没有想到VB数组的索引会有所不同。我尝试使用索引1,但这导致了相同的错误。