2009-05-17 79 views
0

設置:
我有一個COM DLL調用託管的C#DLL中的方法。該函數返回一個C#string []數組,該數組被封送到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); 
    } 

感謝您的幫助,
-Sean!

回答

2

BSTR是一個Unicode字符串,因此您必須使用wchar_t緩衝區和wsprintf_s。現在你打印第一個Unicode字符的ANSI部分,然後停在\ 0上。請,請不要像這樣溢出(原文如此!)。使用安全的_vsnwprintf_s_l及其家族,你的代碼是一種黑客的喜悅,因爲它現在就會被使用。見http://msdn.microsoft.com/en-us/library/d3xd30zz(VS.80).aspx

+0

感謝您的幫助。你是什​​麼意思,「不要像這樣堆棧溢出?」 – Sean 2009-05-18 00:45:46

相關問題