Visual c++ 多次调用CoInitializeEx/ConInitialize-RPCSS服务泄漏内存有什么限制

Visual c++ 多次调用CoInitializeEx/ConInitialize-RPCSS服务泄漏内存有什么限制,visual-c++,com,memory-leaks,Visual C++,Com,Memory Leaks,我们的一个应用程序有一个长循环,当我们的应用程序访问另一个作为“本地服务器”提供COM访问的共享应用程序/服务时,偶尔会导致Windows XP(SP3)RPCSS服务泄漏内存 我现在已经解决了这个原始问题(我想),如果应用程序很快访问其他本地服务器,比如IExplore.exe,可能会出现同样的漏洞 使用Process Explorer监视RPCSS服务,启动IE并运行以下程序后,RPCSS服务将在几秒钟后开始显示一些稳定的IO使用情况,然后私有字节将开始稳定增加。停止应用程序会释放大部分内存

我们的一个应用程序有一个长循环,当我们的应用程序访问另一个作为“本地服务器”提供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();
}
#包括
while(true){
HRESULT hrIni=coinitializex(NULL,COINIT\u多线程);
{
HRESULT-hr;
CComPtr pBrowser2;
hr=CoCreateInstance(CLSID_InternetExplorer,NULL,CLSCTX_LOCAL_服务器,IID_IWebBrowser2,(void**)和pBrowser2);
}
如果(hrIni==S_OK | | hrIni==S_FALSE)conInitialize();
}
这不会导致RPCSS服务在process server中泄漏

#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();
}
#包括
while(true){
HRESULT hrIni=coinitializex(NULL,COINIT\u多线程);
{
HRESULT-hr;
CComPtr pSys;
hr=CoCreateInstance(CLSID\u ADSystemInfo,NULL,CLSCTX\u INPROC\u服务器,IID\u IADsADSystemInfo,(void**)和pSys);
}
如果(hrIni==S_OK | | hrIni==S_FALSE)conInitialize();
}
这种在更大范围内确保Conit和uninit的调整似乎可以避免泄漏,或者可能只是使泄漏非常缓慢

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();
HRESULT hrIni=coinitializex(NULL,COINIT\u多线程);
while(true){
{
HRESULT-hr;
CComPtr pBrowser2;
hr=CoCreateInstance(CLSID_InternetExplorer,NULL,CLSCTX_LOCAL_服务器,IID_IWebBrowser2,(void**)和pBrowser2);
}
}
如果(hrIni==S_OK | | hrIni==S_FALSE)conInitialize();
我是不是犯了一些愚蠢的错误,我只是不明白为什么这里不干净?
或者,init/uninit和调用本地服务是否有一些限制?

在取消初始化之前,尝试在调用线程上泵送“足够”的消息。感谢sugestion wqw,有趣的初始测试,对于一个测试主机,使用“等待和处理消息”200ms似乎可以改善,但20ms还不够。。。是否有可能需要等待最后一条消息,而不是根据时间来做?那里通常没有消息泵(除非控制台应用程序main添加了一个),200毫秒的睡眠似乎也能正常工作。