0

我在 cpp 中实现 c# 事件,就像使用 IConnectionPoint 和 IConnectionPointContainer 概念从托管代码到非托管代码一样,但我得到的 IConnectionPoint 对象为空,没有与接口建立连接。

这是我的 C# 代码:

[ComVisible(true)]
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    [Guid("3E903445-F6A8-416F-AD4A-1FFBE571620A")] 
    public interface ICalculator
    {
        int Add(int Num1, int Num2);      
        void SetHandle(IntPtr handle);
    }

    [ComVisible(true)]
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    [Guid("9CD6E042-EB56-4D9A-80EE-6556F8BC2C2D")]
    public interface ICalculatorEvents
    {

        void Completed(int Result);
    }

    [ComVisible(true)]
    [ClassInterface(ClassInterfaceType.None)]
    [Guid("41761326-67E8-4D0D-9170-2E4C3885A3C3")]
    public class Calculator : ICalculator
    {
        public delegate void AddNumbers(int first,int second);
        public event AddNumbers OnClick;
        private IntPtr _windowHandle;
        public int Add(int Num1, int Num2)
        {
            int Result = Num1 + Num2;


            return Result;
        }
        public void SetHandle(IntPtr handle)
        {
            _windowHandle = handle;
        }

        public void Fire(int a,int b) 
        {
            if (OnClick != null) 
                OnClick(a,b);
        }
    }

这是我的 cpp 代码:

        IConnectionPointContainer   * pCPC;
        IConnectionPoint          * pCP;   //these are declared as a member
        DWORD                       dwAdvise; //variable,shown here for completeness

        //check if this interface supports connectable objects

        hr= _calculator->QueryInterface(IID_IConnectionPointContainer, (void**)&pCPC);//_calculator is the object of the c# calculator class.

        if ( !SUCCEEDED(hr) )
        {
            return hr;
        }

        //
        //ok it does now get the correct connection point interface 
        // in our case IID_IAddEvents
        const IID &iid=StringMethodInCSharp::IID_ICalculatorEvents;//ICalculatorEvents is interface in c#

        // pCP->GetConnectionInterface();
          pCPC->FindConnectionPoint(iid,&pCP);
          _calculator->QueryInterface(iid, (void**)&pCP);//here i am getting null value of pCP,which i don't want.
          IUnknown *pSinkUnk;
        if ( !SUCCEEDED(hr) )
        {
            return hr;
        }

        //we have done with the connection point container interface
        long * pRetVal =new long();
        pCPC->Release();
        //pCP=pCPC;
        CSink *pSink=new CSink();//CSink is the class in cpp where i have implemented ICalculatorEvents Interface.

        if ( NULL == pSink )
        {
              return E_FAIL;
        }

        hr = pSink->QueryInterface (IID_IUnknown,(void **)&pSinkUnk);

        hr = pCP->Advise(pSinkUnk,&dwAdvise);//here i am getting null ptr exception because pCP is getting null.
4

0 回答 0