IConnectionPoint::Advise方法(COM)正在减慢Excel 2016的启动速度

IConnectionPoint::Advise方法(COM)正在减慢Excel 2016的启动速度,com,dde,Com,Dde,在我的应用程序中,我使用IConnectionPoint::advice方法获得到我的ADODB::ConnectionEvents实现的连接 调用advice时,按文件关联启动Excel会花费大量时间(例如,单击.csv文件) 从内部观看启动过程,只有5到15秒的时间,似乎什么都没有发生 我在MSVC中做了一个小例子来说明确切的问题: ::CoInitialize(NULL); IConnectionPointContainer *pCPC = NULL; IConnectionPoint *

在我的应用程序中,我使用
IConnectionPoint::advice
方法获得到我的
ADODB::ConnectionEvents
实现的连接

调用
advice
时,按文件关联启动Excel会花费大量时间(例如,单击.csv文件)

从内部观看启动过程,只有5到15秒的时间,似乎什么都没有发生

我在MSVC中做了一个小例子来说明确切的问题:

::CoInitialize(NULL);
IConnectionPointContainer *pCPC = NULL;
IConnectionPoint *pCP = NULL;
ADODB::_ConnectionPtr pConn;
HRESULT hr;
hr = pConn.CreateInstance(__uuidof(ADODB::Connection));

hr = pConn->QueryInterface(__uuidof(IConnectionPointContainer), (void **)&pCPC);
hr = pCPC->FindConnectionPoint(__uuidof(ADODB::ConnectionEvents), &pCP);
pCPC->Release();

DWORD dwConnEvt;
IUnknown *pUnk = NULL;
CConnEvent *pConnEvent= NULL;
pConnEvent = new CConnEvent(hEvent);
hr = pConnEvent->QueryInterface(__uuidof(IUnknown), (void **) &pUnk);
hr = pCP->Advise(pUnk, &dwConnEvt);
...
和连接件:

class CConnEvent : public ADODB::ConnectionEventsVt {
private:
   ULONG m_cRef;
   HANDLE _hEvent;

public:
   CConnEvent(HANDLE &hEvent) : _hEvent(hEvent)
   { m_cRef = 0; };
   ~CConnEvent() {};

   STDMETHODIMP QueryInterface(REFIID riid, void ** ppv)
   {
      *ppv = NULL;
      if (riid == __uuidof(IUnknown) || riid == __uuidof(ConnectionEventsVt))
         *ppv = this;

      if (*ppv == NULL)
         return ResultFromScode(E_NOINTERFACE);

      AddRef();
      return NOERROR;
   }
   STDMETHODIMP_(ULONG) AddRef()
   {
      return ++m_cRef;
   }
   STDMETHODIMP_(ULONG) Release()
   {
      if (0 != --m_cRef)
         return m_cRef;
      delete this;
      return 0;
   }

   STDMETHODIMP raw_InfoMessage( struct ADODB::Error *pError,
      ADODB::EventStatusEnum *adStatus,
   struct ADODB::_Connection *pConnection)
   {
      *adStatus = ADODB::adStatusOK;
      return S_OK;
   }

   STDMETHODIMP raw_BeginTransComplete( LONG TransactionLevel,
   struct ADODB::Error *pError,
      ADODB::EventStatusEnum *adStatus,
   struct ADODB::_Connection *pConnection)
   {
      *adStatus = ADODB::adStatusOK;
      return S_OK;
   }

   STDMETHODIMP raw_CommitTransComplete( struct ADODB::Error *pError,
      ADODB::EventStatusEnum *adStatus,
   struct ADODB::_Connection *pConnection)
   {
      *adStatus = ADODB::adStatusOK;
      return S_OK;
   }

   STDMETHODIMP raw_RollbackTransComplete( struct ADODB::Error *pError,
      ADODB::EventStatusEnum *adStatus,
   struct ADODB::_Connection *pConnection)
   {
      *adStatus = ADODB::adStatusOK;
      return S_OK;
   }

   STDMETHODIMP raw_WillExecute( BSTR *Source,
      ADODB::CursorTypeEnum *CursorType,
      ADODB::LockTypeEnum *LockType,
      long *Options,
      ADODB::EventStatusEnum *adStatus,
   struct ADODB::_Command *pCommand,
   struct ADODB::_Recordset *pRecordset,
   struct ADODB::_Connection *pConnection)
   {
      *adStatus = ADODB::adStatusOK;
      return S_OK;
   }

   STDMETHODIMP raw_ExecuteComplete( LONG RecordsAffected,
   struct ADODB::Error *pError,
      ADODB::EventStatusEnum *adStatus,
   struct ADODB::_Command *pCommand,
   struct ADODB::_Recordset *pRecordset,
   struct ADODB::_Connection *pConnection)
   {
      *adStatus = ADODB::adStatusOK;
      {
         ::SetEvent(_hEvent);
      }
      return S_OK;
   }

   STDMETHODIMP raw_WillConnect( BSTR *ConnectionString,
      BSTR *UserID,
      BSTR *Password,
      long *Options,
      ADODB::EventStatusEnum *adStatus,
   struct ADODB::_Connection *pConnection)
   {
      *adStatus = ADODB::adStatusOK;
      return S_OK;
   }

   STDMETHODIMP raw_ConnectComplete( struct ADODB::Error *pError,
      ADODB::EventStatusEnum *adStatus,
   struct ADODB::_Connection *pConnection)
   {
      *adStatus = ADODB::adStatusOK;
      return S_OK;
   }

   STDMETHODIMP raw_Disconnect( ADODB::EventStatusEnum *adStatus, struct ADODB::_Connection *pConnection)
   {
      *adStatus = ADODB::adStatusOK;
      return S_OK;
   }
};

如果有任何帮助,我们将不胜感激。

那么长时间的延误都是环境问题。它太短,无法怀疑网络超时。过度热情的反恶意软件是下一个合适的候选者,Office程序是流行的目标,因此请禁用它并重试。@HansPassant延迟与建议方法直接相关。在20多台不同的客户机上,无论是哪一个Windows版本,情况都是一样的。祝贺你,这使它成为一种可以传递给It员工的问题。他们可以找出这些机器的共同点,并实际做一些事情来更改机器配置。所以这看起来不像是一个环境问题。那么长时间的拖延是环境问题。它太短,无法怀疑网络超时。过度热情的反恶意软件是下一个合适的候选者,Office程序是流行的目标,因此请禁用它并重试。@HansPassant延迟与建议方法直接相关。在20多台不同的客户机上,无论是哪一个Windows版本,情况都是一样的。祝贺你,这使它成为一种可以传递给It员工的问题。他们可以找出这些机器的共同点,并实际做一些事情来更改机器配置。因此,这似乎不是一个环境问题。