문제

설정:
관리 된 C# DLL 내부에서 메소드를 호출하는 com dll이 있습니다. 이 함수는 C# String [] 배열을 반환하며 SafeArray로 마샬링됩니다.

문제:
SafearRay 내에서 문자열에 액세스하려고 할 때 나는 문자열의 첫 번째 숯 만 얻습니다. 내가 뭘 잘못하고 있죠?

코드:

    // Pointer to the managed interface
    DatabasePtr pODB(__uuidof(DBClass));

    // Get the string[] array from the managed method
    SAFEARRAY* safearray = pODB->GetStringArray();

    HRESULT hresult;

    long ubound;
    long lbound;

    hresult = SafeArrayGetUBound(safearray, 1, &ubound);
    hresult = SafeArrayGetLBound(safearray, 1, &lbound);

    long index;
    BSTR fromarray;

    for (; lbound <= ubound; lbound++)
    {
        index = lbound;

        hresult = SafeArrayGetElement(safearray, &index, (void*)&fromarray);

        char buffer[512];
        sprintf_s(buffer,"%s",fromarray);

        MessageBox(0, (LPCSTR)buffer, "...", 0);
    }

당신의 도움을 주셔서 감사합니다,
-신자!

도움이 되었습니까?

해결책

BSTR은 유니 코드 문자열이므로 wchar_t 버퍼와 wsprintf_s. 지금은 첫 번째 유니 코드 문자의 ANSI 부분을 인쇄 한 다음 0에서 중지합니다. 그리고 제발, 제발, 그와 같은 오버플로를 쌓지 마십시오 (sic!). 금고를 사용하십시오 _vsnwprintf_s_l 그리고 그 가족, 당신의 코드는 지금과 마찬가지로 해커의 기쁨이며 당신은 pwned 될 것입니다. 보다 http://msdn.microsoft.com/en-us/library/d3xd30zz(vs.80).aspx

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top