2012-12-07 48 views
4

我需要从C++中的无人函数触发用C++/CLI编写的事件。从非托管C/C++函数在C++/CLI中触发事件

这样做的最好方法是什么?

在此先感谢。

+1

传递一个函数指针,当本地代码调用,运行一个引发事件的方法:http://stackoverflow.com/a/2168265/17034 –

+0

具体来说,我需要从C++类的成员函数中引发这一点。 – coolshashi

+0

单词“fire”和“C++ class”并不代表同一句话中的任何内容。 Bjarne Stroustrup从未被解雇。 –

回答

1

我想通了,与一些帮助的帖子一些帮助在CodeProject

思想在这里张贴这可能是为别人有用的

#include "stdafx.h" 
#include "windows.h" 

using namespace System; 
using namespace System::Runtime::InteropServices; 

class Camera 
{ 
public: 
    Camera() 
    { 
    } 
    ~Camera(){} 
    void (*test)(void); 
    void OnNewCameraData(); 
    void StartDataAcquisition(); 

}; 

void Camera::StartDataAcquisition() 
{ 
    int i; 
    while(i<10) 
    { 
     test(); 
     i++; 
     Sleep(1000); 
    } 

} 

delegate void FunctionToCallDelegate(); 

ref class CameraAdapter 
{ 
private: 
    Camera *_camera; 
    FunctionToCallDelegate ^_Function; 
public: 
    CameraAdapter(FunctionToCallDelegate ^handler) 
    { 
     _Function = handler; 
    } 
    void Init() 
    { 
     _camera = new Camera(); 
     pin_ptr<FunctionToCallDelegate^> tmp = &_Function; 
     _camera->test = (void (__cdecl *)(void))(Marshal::GetFunctionPointerForDelegate(_Function).ToPointer()); 
     _camera->StartDataAcquisition(); 
    } 

    ~CameraAdapter() 
    { 
     delete _camera; 
     _camera = 0; 
    } 
    void OnNewCameraData() 
    { 
     Console::WriteLine("Received Frame \n"); 

    } 
}; 


int main(array<System::String ^> ^args) 
{ 

    FunctionToCallDelegate ^dsi; 
    dsi += gcnew FunctionToCallDelegate(gcnew CameraAdapter(dsi), &CameraAdapter::OnNewCameraData); 
    CameraAdapter ^camera = gcnew CameraAdapter(dsi); 
    camera->Init(); 
    Console::ReadKey(); 
    return 0; 
} 
相关问题