0

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.

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?

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!

1 Answer 1

2

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

Sign up to request clarification or add additional context in comments.

7 Comments

Thanks for the help. What do you mean by, "don't stack overflow like that?"
sprintf will overflow buffer if fromarray is bigger that 512
Alright. It won't be bigger than 512, but I'll go w/ the safe route anyways. Thanks again.
Also, you didn't mention that I should've been using MessageBoxW, instead of MessageBox...
right, and your database routines access also. You may want to use the generic TCHAR type and change the project settings to Unicode. Or, if you must stick to ANSI, convert the received fromarray to ANSI first via something like MultiByteToWideChar (msdn.microsoft.com/en-us/library/dd319072(VS.85).aspx). Also you should look into the BSTR wrapper helpers, _bstr_t and CComBSTR. I prefer _bstr_t see msdn.microsoft.com/en-us/library/zthfhkd6(VS.80).aspx
|

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.