Передача управляемого (C #) массива string [] в COM DLL - PullRequest
0 голосов
/ 18 мая 2009

Настройка:
У меня есть COM DLL, которая вызывает метод внутри управляемого C # DLL. Эта функция возвращает массив C # string [], который маршалируется в 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!

1 Ответ

2 голосов
/ 18 мая 2009

BSTR является строкой Unicode, поэтому вы должны использовать буфер wchar_t и wsprintf_s. Прямо сейчас вы печатаете часть ANSI первого символа Юникода, затем останавливаетесь на \ 0. И, пожалуйста, пожалуйста, не переполняйте стек таким образом (так!). Используй сейф _vsnwprintf_s_l и его семью, твой код восхищает хакера, как и сейчас, и ты будешь обманут Смотри http://msdn.microsoft.com/en-us/library/d3xd30zz(VS.80).aspx

...