2013-12-15 46 views
0

我有一个C#dll,它是COM可见的并且具有事件处理程序委托。 在C#程序中使用它没有问题,但我很难在C++中接收事件;从COM#可见的C#dll中获取C++中的事件

这是C#代码简单的例子:

namespace TestCode 
{ 
    public delegate void DataReceivedHandler(object Sender, DataReceivedEventArgs e); 

    public sealed class DataValidator : IDisposable 
    { 


     public event DataReceivedHandler DataReceived; 

     private void OnDataReceived(DataReceivedEventArgs e) 
     { 
      Debug.WriteLine("### " + e.Value); 
      if (DataReceived != null) 
      { 
       DataReceived(this, new DataReceivedEventArgs(e.Status, e.Value, e.RejectedReason)); 
      } 
     } 

    } 


    public class DataReceivedEventArgs : EventArgs 
    { 

     public DataRecievedStatus Status { get; private set; } 
     public int Value { get; private set; } 
     public string RejectedReason { get; private set; } 

     public DataReceivedEventArgs(DataRecievedStatus status, int value, string rejectedReason) 
     { 
      this.Status = status; 
      this.Value = value; 
      this.RejectedReason = rejectedReason; 
     } 
    } 
} 

这是我如何使用它下面的C++例子:

#include <stdlib.h> 
#include <wchar.h> 
#include <windows.h> 

#using <mscorlib.dll> 
#using "TestCode.dll" 

using namespace System; 
using namespace System::Runtime::InteropServices; 
using namespace System::Collections; 
using namespace TestCode; 

namespace libTestCode { 
    public ref class Class1 
    { 
    public: 
     static DataValidator^ cc = nullptr; 
    }; 
} 

实现C++,你看到的问号。这是一个地方,我不知道如何实施它的权利:

#include "libTestCode.h" 

void init() 
{ 
    libTestCode::Class1::cc = gcnew DataValidator(); 

    libCashCode::Class1::cc->DataReceived += gcnew ????????? 

    return NULL; 
} 

将不胜感激任何帮助。

+0

访问您当地的图书馆或书店以取得成功。你实际上并没有使用C++,也没有实际使用COM。 * static *的这种无偿使用会让你陷入很大的麻烦。 –

回答

0

原来,添加事件侦听器几乎一样C#

只有实现C++文件应该编辑

void init() 
{ 
    libTestCode::Class1::cc = gcnew DataValidator(); 

    DataReceivedHandler ^handler = gcnew DataReceivedHandler(myHandler); 

    libCashCode::Class1::cc->DataReceived += handler; 

} 

void myHandler(Object ^obj, DataReceivedEventArgs ^eventArgs) 
{ 

} 

我的错误是,我忘了用“^”为符号myHandler中的参数。