Как завершить процесс, выполняемый во время автоматизации COM - PullRequest
0 голосов
/ 15 мая 2018

Вот код, который запускает Ms Word в фоновом режиме для автоматизации OLE:

int _tmain(int argc, _TCHAR* argv[])
{
    CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
    CLSID clsid;
    HRESULT hr = CLSIDFromProgID(L"Word.Application", &clsid);

    IDispatch *pWApp;
    if(SUCCEEDED(hr))
    {
         //here the process starts
         hr = CoCreateInstance(clsid, NULL, CLSCTX_LOCAL_SERVER,
                               IID_IDispatch, (void **)&pWApp);

         cout << "success" << endl;
    }

    //here I try to end it
    pWApp->Release();
    CoUninitialize();
    return 0;
}

К сожалению, Word остается в памяти после завершения моей программы.Как это остановить?

1 Ответ

0 голосов
/ 15 мая 2018

Объект Word.Application, который вы создаете, имеет метод Quit(), который вы можете дополнительно вызвать перед тем, как Release() указатель вашего интерфейса на объект:

Выход из Microsoft Word и при необходимости сохранение или маршрутизация открытых документов.

Поскольку у вас есть интерфейс IDispatch к объекту, вы можете использовать методы IDispatch::GetIDsOfNames() и IDispatch::Invoke() для вызова Word.Application.Quit() метод, например:

int _tmain(int argc, _TCHAR* argv[])
{
    HRESULT hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
    if (SUCCEEDED(hr))
    {
        CLSID clsid;
        hr = CLSIDFromProgID(L"Word.Application", &clsid);
        if (SUCCEEDED(hr))
        {
            IDispatch *pWApp;
            hr = CoCreateInstance(clsid, NULL, CLSCTX_LOCAL_SERVER, IID_IDispatch, (void **)&pWApp);
            if (SUCCEEDED(hr))
            {
                cout << "success" << endl;

                // use pWApp as needed ...

                DISPID dispID;
                LPOLESTR ptName = L"Quit"; //name of the method
                hr = pWApp->GetIDsOfNames(IID_NULL, &ptName, 1, LOCALE_USER_DEFAULT, &dispID);
                if (SUCCEEDED(hr))
                {
                    //no parameters
                    DISPPARAMS dp = {NULL, NULL, 0, 0};
                    hr = pWApp->Invoke(dispID, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_METHOD, &dp, NULL, NULL, NULL);
                }

                pWApp->Release();
            }
        }

        CoUninitialize();
    }

    return 0;
}
...