2012-12-07 85 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; 
} 
相關問題