将托管(C#)string []数组传递给COM DLL

时间:2022-04-18 07:33:39

Setup:
I have a COM DLL that calls a method inside a managed C# DLL. This function returns a C# string[] array, which is marshaled to a SAFEARRAY.

安装程序:我有一个COM DLL,它调用托管C#DLL中的方法。此函数返回一个C#string []数组,该数组被封送到SAFEARRAY。

Problem:
When I try to access the strings within the safearray I only get the first char of the string. What am I doing wrong?

问题:当我尝试访问safearray中的字符串时,我只获得字符串的第一个字符。我究竟做错了什么?

The code:

    // 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);
    }

Thanks for your help,
-Sean!

谢谢你的帮助,-Sean!

1 个解决方案

#1


The BSTR is an unicode string, so you must use an wchar_t buffer and the wsprintf_s. Right now u print the ANSI part of the first unicode character then stop on the \0. And please, please, don't stack overflow like that (sic!). Use the safe _vsnwprintf_s_l and its family, your code is a hacker's delight as it is right now and u'll be pwned. See http://msdn.microsoft.com/en-us/library/d3xd30zz(VS.80).aspx

BSTR是一个unicode字符串,因此您必须使用wchar_t缓冲区和wsprintf_s。现在你打印第一个unicode字符的ANSI部分然后停在\ 0上。请,请不要像那样堆叠溢出(原文如此!)。使用安全_vsnwprintf_s_l及其系列,您的代码是黑客的喜悦,因为它现在是你的。请参阅http://msdn.microsoft.com/en-us/library/d3xd30zz(VS.80).aspx

#1


The BSTR is an unicode string, so you must use an wchar_t buffer and the wsprintf_s. Right now u print the ANSI part of the first unicode character then stop on the \0. And please, please, don't stack overflow like that (sic!). Use the safe _vsnwprintf_s_l and its family, your code is a hacker's delight as it is right now and u'll be pwned. See http://msdn.microsoft.com/en-us/library/d3xd30zz(VS.80).aspx

BSTR是一个unicode字符串,因此您必须使用wchar_t缓冲区和wsprintf_s。现在你打印第一个unicode字符的ANSI部分然后停在\ 0上。请,请不要像那样堆叠溢出(原文如此!)。使用安全_vsnwprintf_s_l及其系列,您的代码是黑客的喜悦,因为它现在是你的。请参阅http://msdn.microsoft.com/en-us/library/d3xd30zz(VS.80).aspx