多次调用CoInitializeEx / CoUninitialize有什么限制 - RPCSS服务泄漏内存

时间:2011-11-29 23:26:58

标签: visual-c++ com memory-leaks

我们的某个应用程序有一个很长的循环,当我们的应用程序访问另一个提供COM访问作为“本地服务器”的共享应用程序/服务时,偶尔会导致Windows XP(SP3)RPCSS服务泄漏内存。

我现在已经回到了原始问题(我认为),并且如果应用程序正在快速访问其他本地服务器(如IExplore.exe),则会显示相同的泄漏

使用Process Explorer监视RPCSS服务,启动IE然后运行以下命令后,RPCSS服务将在几秒钟后开始显示一些稳定的IO使用情况,然后私有字节将开始稳步增加。停止应用程序会释放大部分内存,但并不总是释放所有内存。

#include <exdisp.h>
while(true){
  HRESULT hrIni = CoInitializeEx(NULL, COINIT_MULTITHREADED);
  {
    HRESULT hr;

    CComPtr<IWebBrowser2> pBrowser2;
    hr = CoCreateInstance(CLSID_InternetExplorer, NULL, CLSCTX_LOCAL_SERVER, IID_IWebBrowser2, (void**)&pBrowser2);
  }
  if( hrIni == S_OK || hrIni == S_FALSE ) CoUninitialize();
}

这不会导致RPCSS服务泄漏 - 进程服务器

#include <activeds.h>
while(true){
  HRESULT hrIni = CoInitializeEx(NULL, COINIT_MULTITHREADED);
  {
    HRESULT hr;

    CComPtr<IADsADSystemInfo> pSys;
    hr = CoCreateInstance(CLSID_ADSystemInfo, NULL, CLSCTX_INPROC_SERVER, IID_IADsADSystemInfo, (void**)&pSys);        
  }
  if( hrIni == S_OK || hrIni == S_FALSE ) CoUninitialize();
}

这种调整以确保CoInit并在更广泛的范围内发现可以避免泄漏,或者可能只是让它变得非常缓慢

HRESULT hrIni = CoInitializeEx(NULL, COINIT_MULTITHREADED);
while(true){
  {
    HRESULT hr;

    CComPtr<IWebBrowser2> pBrowser2;
    hr = CoCreateInstance(CLSID_InternetExplorer, NULL, CLSCTX_LOCAL_SERVER, IID_IWebBrowser2, (void**)&pBrowser2);
  }
}
if( hrIni == S_OK || hrIni == S_FALSE ) CoUninitialize();

我是否犯了一些愚蠢的错误我只是没有看到为什么这不干净? 或者,对init / uninit和调用本地服务有一些限制吗?

0 个答案:

没有答案