hr = pCPC->FindConnectionPoint(DIID__IApplicationEvents,&pCP); //这个可以成功

if(SUCCEEDED(hr))
{

hr = pCP->Advise(testevent, &daCookie);  //此处返回E_NOTIMPL
        }
难道进程外不能使用连接点?有什么需要注意的?
   在线等。

解决方案 »

  1.   

    testevent是什么,是指针吗,你用得正确不,是派生至IDispatch的吗
      

  2.   

    testevent是什么,是指针吗,你用得正确不,是派生至IDispatch的吗
      

  3.   

    testeven是指针,也是从IDispatch派生的,我把程序贴上
    我的程序是这样的
    /**********************************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返回成功
      

  4.   

    能不能说的详细一点啊,是因为进程外的COM的原因吗,因为我用的是别人开发的exe应用程序,好像只能是进程外啊。
      

  5.   

    testeven是指针,也是从IDispatch派生的,我把程序贴上
    是指针的话,那你指向可用的空间没有,申请了内存没有
      

  6.   

    pIX是啥东西?支持连接点不?
      

  7.   

       pIX是一个实例
            ::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失败了,看了一下别人也有遇到这个问题但是就是没找到解决方法。
         急疯了,各位大哥帮忙吧
      

  8.   

    进程外可以使用连接点的。
    这个E_NOTIMPL是组件的IConnectionPoint实现返回的,貌似在声称它不能Advise。
    找找你这个组件相关的信息看看。
      

  9.   

    我看了一下下边是_IApplicationEvents的实现我该怎么样调用呢?
    //
    // 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;
    }
      

  10.   

    EXTERN_C const IID DIID__IApplicationEvents;#if defined(__cplusplus) && !defined(CINTERFACE)    MIDL_INTERFACE("CD866FB4-44BF-11D3-8538-00105A3E017B")
        _IApplicationEvents : public IDispatch
        {
        };
      

  11.   

    发现个问题:
    STDMETHODIMP mylink::QueryInterface(const struct _GUID &iid,void ** ppv)
    {
    *ppv=this;
    return S_OK;
    }
    你居然没判断...Advise的时候组件会询问你的IMarshal,你要告诉它没有!加上条件,只有在IUnknown和IDispatch时才返回S_OK
      

  12.   

    其实我现在的mylink是从IDispatch派生的,所以我没关心这个,好像不是这个条件影响的,我现在只是做个实验,程序是抄杨老师的那个。
      

  13.   

    如果你告诉com你有IMarshal接口,那么com就不会用自己的实现,而要用你的。
      

  14.   

    _IApplicationEvents 是否有Advise,它是否返回成功》
      

  15.   

    没有看到_IApplicationEvents的advise接口实现,只有下面这两个接口,我该怎么连接呢?谢谢了?
    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;
    }
      

  16.   

    我在程序中加入
    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
      

  17.   

    ...
    else 
     return E_NOINTERFACE;
      

  18.   

    if (iid == DIID__IApplicationEvents)这个也不对啊!
    还有IDispatch你要支持的
      

  19.   

    你是指这样吗
    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
      

  20.   

    谢谢你的帮助啊,我现在已经不知道怎么办了,由于是刚学,而且做完这个项目估计以后也不会在使用,就想会用COM就行了,谁知道这么难,我本来是搞嵌入式C的现在搞这个真难啊
      

  21.   

    ULONG __stdcall mylink::AddRef(void)
    { return 2; }
    ULONG __stdcall mylink::Release(void)
    { return 1; }
      

  22.   

    //
    // MessageId: CO_E_FAILEDTOOPENTHREADTOKEN
    //
    // MessageText:
    //
    //  Unable to open the access token of the current thread
    //
    #define CO_E_FAILEDTOOPENTHREADTOKEN     _HRESULT_TYPEDEF_(0x80040202L)换Administrator搞下
      

  23.   

    http://www.bianceng.cn/Programming/VC_NET/200912/13254.htm
    下载这源码看看吧
      

  24.   

      我现在就是Administrator身份啊,另外还想问你
    ULONG __stdcall mylink::AddRef(void)
    { return 2; }
    ULONG __stdcall mylink::Release(void)
    { return 1; }
    为什么要返回2 和1 啊,Release如果返回了1不是释放了之后还会有吗?
      

  25.   

    http://support.microsoft.com/kb/183216/en-us
    参考下。撤退了
      

  26.   

    是从IDispatch派生的,在添加类时增加的
    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);};
    我太感谢你了,仿佛看到了曙光
      

  27.   

    mylink 需要实现IApplicationEvents接口 这样服务端才能回调你
    淡定的走过~~~~.............
      

  28.   

    testevent需要继承IApplicationEvents,即实现该接口