gpt4 book ai didi

c++ - 如何检查容器是否支持多连接?

转载 作者:太空宇宙 更新时间:2023-11-04 12:28:36 25 4
gpt4 key购买 nike

  • 实现了 Sink 类 - 从 COM 服务器接收事件通知
  • 事件接口(interface)派生自 IDispatch

我遇到一个问题,即 IConnectionPoint::Advise 调用返回 E_NOTIMPL。这可能是因为连接点 只允许一个连接 - MSDN .

注意:

  • COM 服务器处于进程外
  • 纯 C++ 实现

编辑:

S8.tlh:与 Win32 类型库 S8.tlb 等效的 C++ 源代码:

struct __declspec(uuid("090910c3-28c3-45fe-861d-edcf11aa9788"))
IS8SimulationEvents : IDispatch
{

// Methods:
HRESULT S8SimulationReset ( );
HRESULT S8SimulationEndRun ( );
HRESULT S8SimulationCustomEvent (
BSTR * TextInfo );
HRESULT S8SimulationOpened ( );
HRESULT S8SimulationEndTrial ( );
HRESULT S8SimulationOEMEvent (
BSTR * TextInfo );
HRESULT S8SimulationReadyToClose ( );
HRESULT S8SimulationUserMessage (
long * Answer,
BSTR * TextMsg,
long ValidAnswers );
};

Class Sink 的实现 - 处理事件通知:

class Sink : public IS8SimulationEvents
{
public:
Sink(){
m_dwRefCount = 0;
};
~Sink(){};
/*
* IS8SimulationEvent interface functions
*/
HRESULT S8SimulationEndTrial()
{
cout << "Simulation complete." << endl;
return S_OK;;
};

HRESULT S8SimulationOpened()
{
cout << "Simulation open." << endl;
return S_OK;
};

HRESULT S8SimulationReadyToClose()
{
cout << "Simulation ready to close" << endl;
return S_OK;
};

ULONG STDMETHODCALLTYPE AddRef()
{
m_dwRefCount++;
return m_dwRefCount;
};

ULONG STDMETHODCALLTYPE Release()
{
ULONG l;
l = m_dwRefCount--;

if (0 == m_dwRefCount)
{
delete this;
}

return m_dwRefCount;
};

HRESULT STDMETHODCALLTYPE QueryInterface(
REFIID iid ,
void **ppvObject)
{
m_dwRefCount++;
*ppvObject = (void *)this;
return S_OK;
};

HRESULT STDMETHODCALLTYPE GetTypeInfoCount(UINT *pctinfo)
{
return E_NOTIMPL;
};

HRESULT STDMETHODCALLTYPE GetIDsOfNames(
REFIID riid,
LPOLESTR *rgszNames,
UINT cNames,
LCID lcid,
DISPID *rgDispId)
{
return E_NOTIMPL;
};

HRESULT STDMETHODCALLTYPE GetTypeInfo(
unsigned int iTInfo,
LCID lcid,
ITypeInfo FAR* FAR* ppTInfo)
{
return E_NOTIMPL;
};

HRESULT STDMETHODCALLTYPE Invoke(
DISPID dispIdMember,
REFIID riid,
LCID lcid,
WORD wFlags,
DISPPARAMS FAR* pDispParams,
VARIANT FAR* pVarResult,
EXCEPINFO FAR* pExcepInfo,
unsigned int FAR* puArgErr)
{
HRESULT hresult = S_OK;
if (pDispParams)
{
switch (dispIdMember) {
case 1:
return S8SimulationEndTrial();
case 2:
return S8SimulationOpened();
case 3:
return S8SimulationReadyToClose();
default:
return E_NOTIMPL;
}

}
return E_NOTIMPL;
}
private:
DWORD m_dwRefCount;
public:
void SetupConnectionPoint (IS8Simulation *pis8)
{

HRESULT hresult;
IConnectionPointContainer *pContainer = NULL;
IConnectionPoint *pConnection = NULL;
IUnknown *pSinkUnk = NULL;
Sink *pSink = NULL;
DWORD dwAdvise;

dwAdvise = 0;

hresult = pis8->QueryInterface(
__uuidof(IConnectionPointContainer),
(void **) &pContainer);

if (SUCCEEDED(hresult))
{
cout << "IConnectionPointContainer inteface supported." << endl;
} else {
cerr << "Error: No such interface supported." << endl;
exit (hresult);
}

__uuidof(IS8SimulationEvents),
&pConnection);

switch (HRESULT_CODE(hresult)) {
case NOERROR:
cout << "Obtained valid interface pointer." << endl;
break;
case E_POINTER:
cerr << "Invalid pointer: the address is not valid." << endl;
exit (hresult);
break;
case CONNECT_E_NOCONNECTION:
cerr << "This connectable object not support the "
"outgoing interface specified." << endl;
exit (hresult);
break;
case E_UNEXPECTED:
default:
cerr << "Catastrophic failure." << endl;
exit (hresult);
break;
}

pContainer->Release();


hresult = pSink->QueryInterface(
__uuidof(IUnknown),
(void **)&pSinkUnk);

if (FAILED(hresult))
{
exit (EXIT_FAILURE);
}

hresult = pConnection->Advise(
pSinkUnk,
&dwAdvise);

switch (HRESULT_CODE(hresult)) {
case NOERROR:
cout << "The connection has been established and "
"*dwAdvise has the connection token." << endl;
break;
case E_POINTER:
cerr << "Invalid pointer: "
"the value pSinkUnk or dwAdvise is not valid." << endl;
exit (hresult);
break;
case CONNECT_E_ADVISELIMIT:
cerr << "The connection point has already reached "
"its limit of connections and cannot accept "
"any more." << endl;
exit (hresult);
break;
case CONNECT_E_CANNOTCONNECT:
cerr << "The sink does not support the interface "
"required by this connection point." << endl;
exit (hresult);
break;
case E_NOTIMPL:
break;
case E_UNEXPECTED:
default:
cerr << "Catastrophic failure." << endl;
exit (hresult);
break;
}
return;
}
};

编辑:

Sink类中IUnknown接口(interface)的实现

ULONG STDMETHODCALLTYPE AddRef()
{
m_dwRefCount++;
return m_dwRefCount;
};

ULONG STDMETHODCALLTYPE Release()
{
ULONG l;
l = m_dwRefCount--;

if (0 == m_dwRefCount)
{
delete this;
}

return m_dwRefCount;
};

HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, void **ppvObject)
{
m_dwRefCount++;
*ppvObject = (void *)this;
return S_OK;
};

问题:

  • 如何检查容器是否支持多连接?
  • 如果需要更多信息,请相应地发表评论。

最佳答案

请再次阅读 MSDN 文章。

 A connection point that allows only one interface can return E_NOTIMPL FROM the IConnectionPoint::EnumConnections methodEnumConnections : E_NOTIMPL The connection point does not support enumeration.

IConnectionPoint::Advise 需要回复

CONNECT_E_ADVISELIMIT

当他的连接点已经达到其连接限制并且不能再接受时。

--

迈克尔

关于c++ - 如何检查容器是否支持多连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/481931/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com