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员工的问题。他们可以找出这些机器的共同点,并实际做一些事情来更改机器配置。因此,这似乎不是一个环境问题。