Передача управляемого (C#) массива string[] в COM DLL
Вопрос
Настраивать:
У меня есть COM DLL, которая вызывает метод внутри управляемой DLL C#.Эта функция возвращает массив string[] C#, который преобразуется в 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
и его семья, ваш код - это радость хакера, какой он есть сейчас, и вас накажут.Видеть http://msdn.microsoft.com/en-us/library/d3xd30zz(VS.80).aspx