设置:
我有一个 COM DLL,它调用托管 C# 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 是一个 unicode 字符串,因此您必须使用 wchar_t 缓冲区和 wsprintf_s. 。现在你打印第一个 unicode 字符的 ANSI 部分,然后停在 \0 上。拜托,拜托,不要像那样堆栈溢出(原文如此!)。使用保险箱 _vsnwprintf_s_l 及其家族,您的代码是黑客的最爱,就像现在一样,您将被攻击。看 http://msdn.microsoft.com/en-us/library/d3xd30zz(VS.80).aspx

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top