2013-05-08 2 views
-1

Я хочу подключить метод к C++ событий, написанной в C++ DLLHooking на C++ DLL событие формы C#

C++ сторона #include

extern "C" 
{ 
    typedef void (__stdcall *PFN_MYCALLBACK)(); 
    int __stdcall MyUnmanagedApi(PFN_MYCALLBACK callback); 
} 

C# сторона

public delegate void MyCallback(); 
[DllImport("data_acquisition_sys.dll")] 
public static extern void MyUnmanagedApi(MyCallback callback); 

static void Main(string[] args) { 

    MyUnmanagedApi(
    delegate() 
    { 
     Console.WriteLine("Called back by unmanaged side"); 
    } 
    ); 
    } 
} 
C#

Я следил за http://blogs.msdn.com/b/davidnotario/archive/2006/01/13/512436.aspx

Ошибка

Unhandled Exception: System.EntryPointNotFoundException: Не удается найти точку входа с именем «MyUnmanagedApi» в DLL 'data_acquisition_sys.dll'. в affect_detection_sys.Program.MyUnmanagedApi (MyCallback обратного вызова) в affect_detection_sys.Program.Main (String [] арг) в C: \ Users \ Public \ DOCUME

+1

Существует очень мало доказательств того, что вы фактически экспортировали функцию, никаких признаков __declspec (dllexport) или упоминания файла .def. Используйте dumpbin.exe/exports в DLL, чтобы увидеть, что видит .NET. Использование анонимного метода, подобного этому, также является фатальным, GC будет мусором собирать его, так как он не может видеть собственный код, используя его. –

ответ

1

MyUnmanagedApi возвращается int и вы объявили void. Попробуйте следующее:

public delegate void MyCallback(); 
[DllImport("data_acquisition_sys.dll")] 
public static extern int MyUnmanagedApi(MyCallback callback); 

static void Main(string[] args) { 

    MyUnmanagedApi(
    delegate() 
    { 
     Console.WriteLine("Called back by unmanaged side"); 
    } 
    ); 
    } 
} 
+0

Я тоже подумал об этом, но ничуть не хотел. Ошибка все еще существует. В этом уроке, который я упомянул, MyUnmanagedApi также объявлен недействительным. – pjercic

1

Для всех заинтересованных сторон, это рабочее решение проблемы.

C++ сторона

extern "C" 
{ 
typedef void (*callback_function)(); 
callback_function gCBF; 

__declspec(dllexport) void StartAcquisition(callback_function callback) { 

    gCBF = callback; 

    cout << "Acquisition started" << endl; 
} 

void DoWork() { 
    gCBF() 
} 
} 

C# сторона

[DllImport("data_acquisition_sys.dll", EntryPoint = "StartAcquisition")] 
    public static extern void StartAcquisition(MyCallback callback); 
StartAcquisition(delegate() 
{ 

    Console.WriteLine("Called back by unmanaged side "); 
} 
); 

Обратите внимание, что callback_function является пустой() метод, после возвращения и принимать обратно ЛЮБЫЕ результаты данных в аварии во время выполнения. Об этом сообщается в других потоках, но ответ не был дан.

Смежные вопросы