2017-11-27 2 views
2

VBA에서 호출 될 때 C++ DLL을 만들었습니다. SAFEARRAY *가 반환됩니다.String의 변형 배열에 대체 공백이 포함되어 있습니다.

내 VBA 기능 :

Declare Function GetData_V Lib "xyz.dll" (ByVal path As String, ByVal id As String, ByRef inputArr() As String, ByRef output() As String) As Variant() 

내 C++ 구현 :

SafeArrayLock(*outputArray); 
    for (LONG i = 0; i < countElements; i++) 
    { 
     CComBSTR bstr = CComBSTR(outputCustom[i]); 
     SafeArrayPutElement(*outputArray, &i, bstr); 
    } 
    SafeArrayUnlock(*outputArray); 

    delete [] outputCustom; 

    return *outputArray; 

나는 그것이 같은 문자열을 보여줍니다 출력을 검사 할 때 outputCustom은 VBA에서

outputCustom = new char*[nCount+1]; 

으로 정의된다 :

1 0 . 9 4 4 9 d 0 
2 . 8 3 4 6 d 0 
0 . 0 1 1 8 d 0 
0 . 6 2 9 9 d 0 
0 . 6 2 9 9 d 0 
0 . 6 2 9 9 d 0 
2 5 . 0 d 0 
0 . 0 7 6 4 d 0 
1 0 . 9 4 4 9 d 0 
2 . 8 3 4 6 d 0 
0 . 0 1 1 8 d 0 

코드를 디버깅하여 C++에서 * outputArray의 값을 확인했지만 모든 것이 잘되었지만 VBA에서 배열을 검사하면 각 문자열의 각 문자 사이에 여분의 공백이 생겼습니다.

+0

다음은 동일한 일을하는 사람이 발견 한 블로그입니다. 결론은 'AA'의 답변에 따른 것입니다. https://www.daniweb.com/programming/software-development/threads/271964/returning-array-of -string-from-c-dll-to-vba – UKMonkey

답변

2

VBA는 VB6과 마찬가지로 유니 코드 (와이드 문자) 문자열을 필요로합니다.

How to: Access DLLs in Excel -- Variant and String Arguments :

엑셀 와이드 문자 유니 코드 문자열을 내부적으로 작동합니다. VBA 사용자 정의 함수를 String 인수로 선언하면 Excel에서 제공된 문자열을 로캘 별 방식으로 바이트 문자열로 변환합니다. 함수를 유니 코드 문자열로 전달하려면 VBA 사용자 정의 함수가 String 인수 대신 Variant를 받아 들여야합니다. DLL 함수는 VBA에서 Variant BSTR 와이드 문자 문자열을 받아 들일 수 있습니다.

표시되는 공백은 16 비트 문자의 0 바이트 상위 바이트입니다. wchar_t을 사용하거나 문자열을 CComBSTR 생성자로 전달하기 전에 widechar로 변환해야합니다. MultiByteToWideChar, mbstowcs 또는 ATL and MFC String Conversion Macros을 사용하면됩니다.

VBA가 VB에서 DLL로 그러한 개체를 전달하고 거기에서 검사하는 것이 좋은지 알기 바랍니다.

Eric’s Complete Guide To BSTR Semantics 또한 흥미로운 내용입니다.

관련 문제