--------有关连接点的问题,为什么我的事件接收器不能接收到事件?----------

Congy 2002-05-14 09:28:57
我用ATL写了一个 EXE 服务,定义了一个出接口 IEvent(IDispatch 接口,ATL向导实现了其代理), 在客户中实现了此处接口(CEventSink),用函数 AtlAdvise建立了CEventSink与服务类的连接,成功。但是CEventSink 不能接收到事件,IEvent的代理激活其Invoke函数时,返回结果码为:0x80020003. 我没有找到原因,请高手指点,高分奉送
...全文
56 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
Congy 2002-05-14
  • 打赏
  • 举报
回复
原来我忘了调用_Module.Init(NULL, NULL);了
可是还是触发不了事件
Congy 2002-05-14
  • 打赏
  • 举报
回复
在 pDispatch->Invoke(0x1, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, &varResult, NULL, NULL);这句出错的
可是这句是向导生成的阿,怎么回有错???
}
zxs218 2002-05-14
  • 打赏
  • 举报
回复
你是在调用那句时发生这个错误的?
zxs218 2002-05-14
  • 打赏
  • 举报
回复
错误的含义是:

// MessageId: DISP_E_MEMBERNOTFOUND
//
// MessageText:
//
// Member not found.

你是执行那句有这个错误的。
jeffchen 2002-05-14
  • 打赏
  • 举报
回复
0x80020003是找不到成员
Congy 2002-05-14
  • 打赏
  • 举报
回复
edrftgyh(老胡) :
参数肯定对的
edrftgyh 2002-05-14
  • 打赏
  • 举报
回复
你看看参数对不对?
Congy 2002-05-14
  • 打赏
  • 举报
回复
顶~
Congy 2002-05-14
  • 打赏
  • 举报
回复
我的源代码大致如下:
1,服务组件: CChatSrv 是一个简单的聊天室服务器
class ATL_NO_VTABLE CChatSrv :
public CComObjectRootEx<CComMultiThreadModel>,
public CComCoClass<CChatSrv, &CLSID_ChatSrv>,
public ISupportErrorInfo,
public IConnectionPointContainerImpl<CChatSrv>,
public IDispatchImpl<IChatSrv, &IID_IChatSrv, &LIBID_ATLSRVLib>,
public CProxy_IChatSrvEvents< CChatSrv >
{
public:
...
// 接口映射
DECLARE_PROTECT_FINAL_CONSTRUCT()

BEGIN_COM_MAP(CChatSrv)
COM_INTERFACE_ENTRY(IChatSrv)
COM_INTERFACE_ENTRY(IDispatch)
COM_INTERFACE_ENTRY(ISupportErrorInfo)
COM_INTERFACE_ENTRY(IConnectionPointContainer)
COM_INTERFACE_ENTRY_AGGREGATE(IID_IMarshal, m_pUnkMarshaler.p)
COM_INTERFACE_ENTRY_IMPL(IConnectionPointContainer)
END_COM_MAP()
BEGIN_CONNECTION_POINT_MAP(CChatSrv)
CONNECTION_POINT_ENTRY(IID__IChatSrvEvents)
END_CONNECTION_POINT_MAP()

// ...
// IChatSrv
public:
STDMETHOD(Disconnect)(BSTR usr)
{ ... Fire_OnNewGuest( usr ); ... };
STDMETHOD(Connect)(BSTR usr);
STDMETHOD(SendMsg)(BSTR msg);
...
}

2, 连接代理 //vc 自动生成
template <class T>
class CProxy_IChatSrvEvents : public IConnectionPointImpl<T, &IID__IChatSrvEvents, CComDynamicUnkArray>
{
//Warning this class may be recreated by the wizard.
public:
HRESULT Fire_OnNewGuest(BSTR usr)
{
CComVariant varResult;
T* pT = static_cast<T*>(this);
int nConnectionIndex;
CComVariant* pvars = new CComVariant[1];
int nConnections = m_vec.GetSize();
for (nConnectionIndex = 0; nConnectionIndex < nConnections; nConnectionIndex++)
{
pT->Lock();
CComPtr<IUnknown> sp = m_vec.GetAt(nConnectionIndex);
pT->Unlock();
IDispatch* pDispatch = reinterpret_cast<IDispatch*>(sp.p);
if (pDispatch != NULL)
{
VariantClear(&varResult);
pvars[0] = usr;
DISPPARAMS disp = { pvars, NULL, 1, 0 };
pDispatch->Invoke(0x1, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &disp, &varResult, NULL, NULL);
}
}
delete[] pvars;
return varResult.scode;

}
...
}

3, 客户端
(1)出接口在客户端的实现(_IChatSrvEvents)
class CChatEventSink :
public IDispatchImpl<_IChatSrvEvents, &IID__IChatSrvEvents, &LIBID_ATLSRVLib>,
public CComObjectRoot
{
public:
CChatEventSink(){};
BEGIN_COM_MAP(CChatEventSink)
COM_INTERFACE_ENTRY(IDispatch)
COM_INTERFACE_ENTRY(_IChatSrvEvents)
END_COM_MAP()
// methods defined by IChatSrvEvents
STDMETHOD(OnNewGuest)(BSTR usr)
{
_bstr_t str(usr);
printf("%s\t%s\n", str, "coming now") ;
MessageBox(NULL, str, "A guest coming", MB_OK);
return S_OK;
}
...
}
(2) COM环境的初始化
//Global variant
IChatSrv* pChatSrv = NULL;
CComObject<CChatEventSink>* pDriver = NULL;
DWORD dwCookie = 0;

BOOL Init()
{
HRESULT hr = CoInitialize(NULL);
if(FAILED( hr )) return FALSE;
_Module.Init(NULL, NULL);
hr = CoCreateInstance(CLSID_ChatSrv, NULL, CLSCTX_LOCAL_SERVER, IID_IChatSrv, (LPVOID*)(&pChatSrv));
if( FAILED(hr) ) goto INIT_FAILED;
hr = CComObject<CChatEventImpl>::CreateInstance(&pDriver);
if(FAILED(hr)) goto INIT_FAILED;
hr = AtlAdvise(pChatSrv, pDriver->GetUnknown(), IID__IChatSrvEvents, &dwCookie);
if( FAILED(hr) ) goto INIT_FAILED;
return TRUE;
INIT_FAILED:
if(pChatSrv) pChatSrv->Release();
CoUninitialize();
return FALSE;
}

问题:我用AtlAdvise建立了CEventSink(即CChatEventSink)与服务类的连接,成功。但是CEventSink 不能接收到事件,IChatSrvEvents的代理激活其Invoke函数时,返回结果码为:0x80020003. 我没有找到原因,请高手指点,高分奉送

Congy 2002-05-14
  • 打赏
  • 举报
回复
请高手指教

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧