¿Cómo invoco funciones que reciben valores de punto flotante usando IDispatch.Invoke?

Tengo problemas para llamar a una función que tiene un argumento de punto flotante y un resultado de punto flotante, usandoIDispatch.Invoke.

Aquí hay una reproducción mínima:

#include <atlbase.h>
#include <comutil.h>

int main(int argc, char* argv[])
{
    CoInitialize(NULL);
    CComPtr<IDispatch> wordapp;
    if (SUCCEEDED(wordapp.CoCreateInstance(L"Word.Application", NULL, CLSCTX_LOCAL_SERVER)))
    {
        CComVariant result;
        CComVariant centimeters((float)2.0);
        CComVariant retval = wordapp.Invoke1(L"CentimetersToPoints", &centimeters, &result);
    }
    return 0;
}

Estoy usando el ATLCComPtr para hacer las cosas más limpias. Pero es una envoltura muy suelta alrededorIDispatch.Invoke.

Cuando ejecuto esto, la llamada aInvoke1 falla y devuelveE_FAIL.

Sospecho que el problema está relacionado con el uso de argumentos de punto flotante y / o valor de retorno. Si llamo a una función que no usa tales valores, la invocación tiene éxito:

CComVariant retval = wordapp.Invoke0(L"ProductCode", &result);

Observo que si llamo a la función desde VBS, o desde PowerShell, tiene éxito. Supongo que los dos usan el límite tardíoIDispatch y eso indicaría que lo que estoy intentando es al menos posible.

Entonces, ¿cómo puedo llamar a esta función usandoIDispatch?

Respuestas a la pregunta(1)

Su respuesta a la pregunta