在C++中处理C#COM事件

Gee*_*ndy 5 c# c++ com

我设法用事件创建一个C#COM对象.请在下面找到代码,

    [Guid("1212674-38748-45434")]
    public interface ICalculator
    {
        int Add(int Num1, int Num2);
    }

    [InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
    [Guid("3453674234-84444-84784")]
    public interface ICalculatorEvents
    {
        [DispId(1)]
        void Completed(int Result);
    }

    [ClassInterface(ClassInterfaceType.None)]
    [ComSourceInterfaces(typeof(ICalculatorEvents))]
    [Guid("87457845-945u48-4954")]
    public class Calculator : ICalculator
    {
        public delegate void CompletedDelegate(int result);
        public event CompletedDelegate Completed;
        public Add(int Num1, int Num2)
        {
            int Result = Num1 + Num2;
            if(Completed != null)
                Completed(Result);
        }
    }
Run Code Online (Sandbox Code Playgroud)

我已在C++控制台应用程序中导入此COM对象,并能够调用'Add()'方法.我不知道如何在我的C++应用程序中处理'Completed'事件.你能就此提出建议吗?我希望在发生此事件时在控制台中显示结果值.

请在下面找到C++应用程序的代码.事件'已完成'永远不会在此处理.这进入了一个无限循环.

    #import "Calculator.tlb"
    using namespace Calculator;
    int Flag = 0;
    class HandleEvent : public ICalculatorEvent
    {
        public:
            HandleEvent(void);
            ~HandleEvent(void);
            HRESULT __stdcall QueryInterface(const IID &, void **);
            ULONG __stdcall AddRef(void) { return 1; }
            ULONG __stdcall Release(void) { return 1; }
            HRESULT __stdcall Completed(int Result);
    };

    HandleEvent::HandleEvent(void)
    {
    }

    HRESULT HandleEvent::Completed(int Result)
    {
        printf("Addition Completed, Result: %d", Result);
        Flag = 1;
    }

    HRESULT HandleEvent::QueryInterface(const IID & iid,void ** pp)
    {
        if (iid == __uuidof(ICalculatorEvent) || iid == __uuidof(IUnknown))
        {
            *pp = this;
            AddRef();
            return S_OK;
        }
        return E_NOINTERFACE;
    }

    int _tmain(int argc, _TCHAR* argv[])
    {
        CoInitialize(NULL);
        Flag = 0;
        ICalculatorPtr pCalc(__uuidof(Calculator));
        pCalc->Add(5, 6);

        do
        {
        }while(Flag == 0);

        CoUninitialize ();
        return 0;
    }
Run Code Online (Sandbox Code Playgroud)

提前致谢.

小智 0

如果您想使用委托,则无需声明接口。像这样更改 _tmain() 函数:

int _tmain(int argc, _TCHAR* argv[])
{
    CoInitialize(NULL);
    Flag = 0;

    EventHandler evh ;
    ICalculatorPtr pCalc(__uuidof(Calculator));
    pCalc->Completed = &evh.Completed() ;
    pCalc->Add(5, 6);

    do
    {
    }while(Flag == 0);

    CoUninitialize ();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

如果你想使用界面,试试这个。

 [ClassInterface(ClassInterfaceType.None)]
 [ComSourceInterfaces(typeof(ICalculatorEvents))]
 [Guid("87457845-945u48-4954")]
 public class Calculator : ICalculator
 {
     public ICalculatorEvents callbackObject ;

     public Add(int Num1, int Num2)
     {
         int Result = Num1 + Num2;
         if(callbackObject != null)
             callbackObject.Completed(Result);
     }
 }
Run Code Online (Sandbox Code Playgroud)

并将 _tmain() 方法更改为此。

int _tmain(int argc, _TCHAR* argv[])
{
    CoInitialize(NULL);
    Flag = 0;

    EventHandler evh ;
    ICalculatorPtr pCalc(__uuidof(Calculator));
    pCalc->callbackObject = &evh ;
    pCalc->Add(5, 6);

    do
    {
    }while(Flag == 0);

    CoUninitialize ();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)