È una tecnica di automazione basata sulle interfacce COM, non è una passeggiata di salute, soprattutto se affrontata in vanilla C.

QUI trovi un po' di esempi.

Esempio minimale:

codice:
HRESULT hres;
CLSID clsid;
CLSIDFromProgID(L"Excel.Application", &clsid);
IDispatch *excelApp;

// Start Excel as a COM server in a separate process
hres = CoCreateInstance(&clsid, 0, CLSCTX_LOCAL_SERVER, IID_IDispatch, (void **)&excelApp);

if(FAILED(hres))
{
    // error handling
}

DISPID dispidVisible;
OLECHAR *propertyName = "Visible";
hres = excelApp->GetIDsOfNames(IID_NULL, &propertyName, 1, LOCALE_SYSTEM_DEFAULT, &dispidVisible);

if(FAILED(hres))
{
    // error handling
}

unsigned returnArg;
VARIANT varTrue;
DISPPARAMS params = { &varTrue, 1, 0, 0 };

// set the variant to a boolean true
varTrue.vt = VT_BOOL;
varTrue.boolVal = 0xFFFF;

// make the window visible: excelApp.Visible = True
hres = excelApp->Invoke(dispidVisible, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_PROPERTYPUT, params, 0, 0, &returnArg);

if(FAILED(hres))
{
    // error handling
}

// ... use the object

// free the object
excelApp->Release();