hr = pCPC->FindConnectionPoint(DIID__IApplicationEvents,&pCP); //这个可以成功
if(SUCCEEDED(hr))
{
hr = pCP->Advise(testevent, &daCookie); //此处返回E_NOTIMPL
}
难道进程外不能使用连接点?有什么需要注意的?
在线等。
if(SUCCEEDED(hr))
{
hr = pCP->Advise(testevent, &daCookie); //此处返回E_NOTIMPL
}
难道进程外不能使用连接点?有什么需要注意的?
在线等。
我的程序是这样的
/**********************************IDispatch*************************************************/
mylink::mylink(void)
{
}mylink::~mylink(void)
{
}
STDMETHODIMP mylink::QueryInterface(const struct _GUID &iid,void ** ppv)
{
*ppv=this;
return S_OK;
}ULONG __stdcall mylink::AddRef(void)
{ return 1; } // 做个假的就可以,因为反正这个对象在程序结束前是不会退出的ULONG __stdcall mylink::Release(void)
{ return 0; } // 做个假的就可以,因为反正这个对象在程序结束前是不会退出的STDMETHODIMP mylink::GetTypeInfoCount(
/* [out] */ UINT *pctinfo)
{ return E_NOTIMPL; } // 不用实现,反正也不用STDMETHODIMP mylink::GetTypeInfo(
/* [in] */ UINT iTInfo,
/* [in] */ LCID lcid,
/* [out] */ ITypeInfo **ppTInfo)
{ return E_NOTIMPL; } // 不用实现,反正也不用STDMETHODIMP mylink::GetIDsOfNames(
/* [in] */ REFIID riid,
/* [size_is][in] */ LPOLESTR *rgszNames,
/* [in] */ UINT cNames,
/* [in] */ LCID lcid,
/* [size_is][out] */ DISPID *rgDispId)
{ return E_NOTIMPL; } // 不用实现,反正也不用
HRESULT STDMETHODCALLTYPE mylink::Invoke(
/* [in] */ DISPID dispIdMember,
/* [in] */ REFIID riid,
/* [in] */ LCID lcid,
/* [in] */ WORD wFlags,
/* [out][in] */ DISPPARAMS *pDispParams,
/* [out] */ VARIANT *pVarResult,
/* [out] */ EXCEPINFO *pExcepInfo,
/* [out] */ UINT *puArgErr)
{ // 只需要实现这个就足够啦 ::AfxMessageBox(L"收到事件");
switch(dispIdMember) // 根据不同的dispID,完成不同的回调函数
{
case 1:
break;
case 2:
// 事件的代号 dispID 其实就是 IDL 文件中的连接点函数的id(n)的号码
break;
default: break;
}
return S_OK;
}
/**************************************************************************************************************************/ IConnectionPointContainer *pCPC;
hr = pIX->QueryInterface(IID_IConnectionPointContainer,(void **)&pCPC);
IConnectionPoint *pCP;
hr = pCPC->FindConnectionPoint(DIID__IApplicationEvents,&pCP);
DWORD daCookie;
mylink *testevent = new mylink(); //从IDispatch中派生的类,其中实现了invoke虽然只有些case
if(SUCCEEDED(hr))
{
hr = pCP->Advise(testevent, &daCookie); //此处返回的错误E_NOTIMPL
} while(1)
{
if(daCookie > 0)
{
}
}
FindConnectionPoint返回成功
是指针的话,那你指向可用的空间没有,申请了内存没有
::CoInitialize(NULL);
IApplication *pIX = NULL; CLSID clsid = {0x7F31DEB1,0x5bcc,0x11d3,{0x85,0x62,0x00,0x10,0x5a,0x3e,0x01,0x7b}};
HRESULT hr = ::CoCreateInstance(clsid, NULL, CLSCTX_SERVER , IID_IApplication,(void **)&pIX);
肯定是支持连接点的,我就是不知道为什么advise失败了,看了一下别人也有遇到这个问题但是就是没找到解决方法。
急疯了,各位大哥帮忙吧
这个E_NOTIMPL是组件的IConnectionPoint实现返回的,貌似在声称它不能Advise。
找找你这个组件相关的信息看看。
//
// dispinterface _IApplicationEvents wrapper method implementations
//inline HRESULT _IApplicationEvents::OnOpen ( _bstr_t Name ) {
HRESULT _result = 0;
_com_dispatch_method(this, 0x1, DISPATCH_METHOD, VT_ERROR, (void*)&_result,
L"\x0008", (BSTR)Name);
return _result;
}inline HRESULT _IApplicationEvents::OnQuit ( ) {
HRESULT _result = 0;
_com_dispatch_method(this, 0x2, DISPATCH_METHOD, VT_ERROR, (void*)&_result, NULL);
return _result;
}
_IApplicationEvents : public IDispatch
{
};
STDMETHODIMP mylink::QueryInterface(const struct _GUID &iid,void ** ppv)
{
*ppv=this;
return S_OK;
}
你居然没判断...Advise的时候组件会询问你的IMarshal,你要告诉它没有!加上条件,只有在IUnknown和IDispatch时才返回S_OK
inline HRESULT _IApplicationEvents::OnOpen ( _bstr_t Name ) {
HRESULT _result = 0;
_com_dispatch_method(this, 0x1, DISPATCH_METHOD, VT_ERROR, (void*)&_result,
L"\x0008", (BSTR)Name);
return _result;
}inline HRESULT _IApplicationEvents::OnQuit ( ) {
HRESULT _result = 0;
_com_dispatch_method(this, 0x2, DISPATCH_METHOD, VT_ERROR, (void*)&_result, NULL);
return _result;
}
STDMETHODIMP mylink::QueryInterface(const struct _GUID &iid,void ** ppv)
{
if (iid == DIID__IApplicationEvents)
{
*ppv = (void *)this;
return S_OK;
} if (iid == IID_IUnknown)
{
*ppv = (void *)this;
return S_OK;
}
}
advise还是返回错误-1073741819
else
return E_NOINTERFACE;
还有IDispatch你要支持的
if (iid == IID_IDispatch)
{
*ppv = (void *)this;
return S_OK;
} if (iid == IID_IUnknown)
{
*ppv = (void *)this;
return S_OK;
}
else
{
return E_NOINTERFACE;
}
这样返回-2147220990
{ return 2; }
ULONG __stdcall mylink::Release(void)
{ return 1; }
// MessageId: CO_E_FAILEDTOOPENTHREADTOKEN
//
// MessageText:
//
// Unable to open the access token of the current thread
//
#define CO_E_FAILEDTOOPENTHREADTOKEN _HRESULT_TYPEDEF_(0x80040202L)换Administrator搞下
下载这源码看看吧
ULONG __stdcall mylink::AddRef(void)
{ return 2; }
ULONG __stdcall mylink::Release(void)
{ return 1; }
为什么要返回2 和1 啊,Release如果返回了1不是释放了之后还会有吗?
参考下。撤退了
class mylink :
public IDispatch
{
public:
mylink(void);
virtual ULONG __stdcall AddRef(void);
virtual ULONG __stdcall Release(void);
virtual HRESULT STDMETHODCALLTYPE QueryInterface(
/* [in] */ REFIID riid,
/* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject); virtual HRESULT STDMETHODCALLTYPE GetTypeInfoCount(
/* [out] */ UINT *pctinfo);
virtual HRESULT STDMETHODCALLTYPE GetTypeInfo(
/* [in] */ UINT iTInfo,
/* [in] */ LCID lcid,
/* [out] */ ITypeInfo **ppTInfo);
virtual HRESULT STDMETHODCALLTYPE GetIDsOfNames(
/* [in] */ REFIID riid,
/* [size_is][in] */ LPOLESTR *rgszNames,
/* [in] */ UINT cNames,
/* [in] */ LCID lcid,
/* [size_is][out] */ DISPID *rgDispId);
virtual /* [local] */ HRESULT STDMETHODCALLTYPE Invoke(
/* [in] */ DISPID dispIdMember,
/* [in] */ REFIID riid,
/* [in] */ LCID lcid,
/* [in] */ WORD wFlags,
/* [out][in] */ DISPPARAMS *pDispParams,
/* [out] */ VARIANT *pVarResult,
/* [out] */ EXCEPINFO *pExcepInfo,
/* [out] */ UINT *puArgErr);public:
~mylink(void);};
我太感谢你了,仿佛看到了曙光
淡定的走过~~~~.............