2011-09-07 5 views
0

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; 
+0

호기심에서 벗어나서 'SafeArrayGetLBound' 및'SafeArrayGetUBound '에 의해보고되는 경계는 무엇입니까? –

답변

1

1) 통과 또는 C++의 노드를 반복하지 않고하는 jobject에 직접)를 SAFEARRAY (또는 VARIANT를 캐스팅 할 수 있습니까?

절대적으로 두렵습니다. 배열을 거치며 모든 필요한 값을 추출하고 각각을 Java가 이해할 수있는 것으로 변환 할 것입니다.

2) 잘못된 매개 변수를 사용하여 SAFEARRAY 데이터를 얻고 있습니까? 액세스 포인터 (var)의 크기를 미리 할당해야합니까?

가장 의심스러운 인수는 indexArray이며 각 측정 기준에 대해 0으로 설정되어 있습니다. 그러나 Visual Basic에서 배열을 만든 경우 인덱스가 0이되도록 0 기반 배열 대신 1부터 시작하는 배열 일 가능성이 큽니다.

이 때문에 요소 추출 코드는 SafeArrayGetLBoundSafeArrayGetUBound의 결과에주의해야합니다.

+0

반환 된 범위는 9 개 항목의 긴 배열에 대해 0과 8이었습니다. VB 배열이 다르게 인덱싱되는 것에 대해 생각조차하지 않았습니다. 인덱스 1을 사용해 보았지만 같은 오류가 발생했습니다. – winchella

관련 문제