Variant를 반환하는 함수가있는 VB6 ActiveX DLL이 있습니다. Variant는 노드 Variant의 배열을 포함하며, 각 배열은 Name 문자열과 두 개의 데이터 배열 (string 및 double)을 포함합니다. 나는이를 JNI를 통해 jobject로서 Java 프로그램에 반환하려고 시도하고있다.JNI를 사용하여 변형의 SafeArray에 액세스
적절한 VB 함수를 호출하고 Variant 결과를 SAFEARRAY로 저장하여 외부 노드 배열에 액세스 할 수 있습니다. 차원에 액세스하여 상한 및 하한을 얻을 수 있습니다. 그러나 SafeArrayGetElement() 또는 SafeArrayAccessData()를 통해 각 노드에 액세스 할 수 없습니다. 난 항상 잘못된 인수 예외가 발생합니다.
1) C++의 노드를 반복하지 않고도 SAFEARRAY (또는 VARIANT)를 jobject에 직접 전달하거나 캐스트 할 수 있습니까?
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;
호기심에서 벗어나서 'SafeArrayGetLBound' 및'SafeArrayGetUBound '에 의해보고되는 경계는 무엇입니까? –