2009-05-17 4 views
0

설정을 관리 (C 번호) 문자열 [] 배열을 전달 :
난 관리 C# 1 DLL 내부 메소드를 호출하는 COM의 DLL있다. 이 함수는 SAFEARRAY에 마샬링 된 C# 문자열 [] 배열을 반환합니다.는 COM DLL

문제 :
나는 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); 
    } 

감사합니다,
- 션!

답변

2

BSTR은 유니 코드 문자열이므로 wchar_t 버퍼와 wsprintf_s을 사용해야합니다. 지금은 첫 번째 유니 코드 문자의 ANSI 부분을 인쇄 한 다음 \ 0에서 멈 춥니 다. 제발, 제발, 그런 식으로 넘치지 마라. 안전한 _vsnwprintf_s_l과 그 가족을 사용하십시오. 코드가 해커의 기쁨입니다. http://msdn.microsoft.com/en-us/library/d3xd30zz(VS.80).aspx

+0

도움을 주셔서 감사합니다. 너는 무엇을 의미하니, 그런 식으로 넘치지 않겠 느냐? – Sean

+0

fromarray가 크면 sprintf가 버퍼 오버플로합니다. 512 –

+0

좋아요. 그것은 512보다 크지 않을 것이다. 그러나 나는 안전한 길을 가고있다. 다시 한번 감사드립니다. – Sean