Pregunta

Configuración:
Tengo una DLL COM que llama a un método dentro de una DLL de C # administrado. Esta función devuelve una matriz C # string [], que se calculan las referencias a un SAFEARRAY.

Problema:
Cuando intento acceder a las cuerdas dentro de la safearray solo me dan el primer carácter de la cadena. ¿Qué estoy haciendo mal?

El código:

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

Gracias por su ayuda, España -Sean!

¿Fue útil?

Solución

El BSTR es una cadena Unicode, por lo que debe utilizar un buffer wchar_t y la wsprintf_s. En este momento u imprimir la parte ANSI del primer carácter Unicode y luego se detiene en el \ 0. Y por favor, por favor, no desbordamiento de pila como que (sic). Utilice el _vsnwprintf_s_l inocuos, y su familia, su código es el deleite de un hacker, ya que es en este momento y ua ser pwned. Ver http://msdn.microsoft.com/en- es / library / d3xd30zz (VS.80) .aspx

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top