【问题标题】:How to end the process executed during COM automation如何结束 COM 自动化期间执行的进程
【发布时间】:2018-10-24 15:47:21
【问题描述】:

这是在后台运行 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 仍保留在内存中。如何阻止它?

【问题讨论】:

  • 我认为如果没有客户端使用,服务器在内存中保留几分钟然后退出是正常的
  • @M.M Ahh,所以不需要做其他事情了吗?
  • 我对 MS Word 不太了解;您的代码看起来正确,但服务器行为取决于服务器本身
  • 试试Quit method

标签: c++ com ole


【解决方案1】:

您正在创建的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;
}

【讨论】:

  • 我将工作代码添加到您的答案中以使其更好。
猜你喜欢
  • 2017-07-01
  • 2020-07-10
  • 2012-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多