Frage

Setup:
Ich habe einen COM-DLL, die eine Methode in einem verwalteten C # DLL aufruft. Diese Funktion gibt einen C # string [] Array, das auf einen SAFEARRAY gemarshallte wird.

Problem:
Wenn ich versuche, die Saiten in der Safearray zuzugreifen bekomme ich nur das erste Zeichen des Strings. Was mache ich falsch?

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

Danke für Ihre Hilfe,
-Sean!

War es hilfreich?

Lösung

Der BSTR ist ein Unicode-String, so dass Sie einen wchar_t Puffer und die wsprintf_s verwenden. Gerade jetzt druckt u der ANSI Teil der ersten Unicode-Zeichen dann auf dem \ 0 stoppen. Und bitte, bitte, Stack-Überlauf nicht wie die (sic!). Verwenden Sie die sichere _vsnwprintf_s_l und seine Familie, Ihr Code ist ein Paradies für Hacker, wie es jetzt ist und u pwned werden. Siehe http://msdn.microsoft.com/en- us / library / d3xd30zz (VS.80) aspx

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top