У меня есть обратный вызов внутри a C DLL (статическая пустота __stdcall). Я хочу, чтобы другая программа зарегистрировала ее как таковую (передав ее func ptr), а затем вызовите calback внутри DLL. До сих пор мне не повезло. Тем не менее, тот же обратный вызов работает, если он находится внутри обычной программы на C++. Теперь мне интересно, возможно ли иметь обратные вызовы в DLL. Любая помощь будет оценена!обратные вызовы внутри DLL?
Спасибо.
Добавление код:
C# приложение:
[DllImport("DLLfilename.dll")]
public static extern void DLL_SetCallback(CallbackDelegate pfn);
public delegate void CallbackDelegate();
//setDelegate() is called in init() of the C# app
public void setDelegate()
{
CallbackDelegate CallbackDelegateInstance = new CallbackDelegate(callback);
DLL_SetCallback(CallbackDelegateInstance);
}
public void callback()
{
//This is the function which will be called by the DLL
MessageBox.Show("Called from the DLL..");
}
C DLL: // связана с externalLibrary.lib
#include "externalLibrary.h"
typedef void (__stdcall CallbackFunc)(void);
CallbackFunc* func; //global in DLL
//Exported
extern "C" __declspec(dllexport) void DLL_SetCallback(CallbackFunc* funcptr)
{
//setting the function pointer
func = funcptr;
return;
}
//Exported
extern "C" __declspec(dllexport) void RegisterEventHandler(Target, Stream,&ProcessEvent , NULL)
{
//ProcessEvent is func to be caled by 3rd party callback
//Call third-party function to register &ProcessEvent func-ptr (succeeds)
...
return;
}
//This is the function which never gets called from the 3rd party callback
//But gets called when all the code in the DLL is moved to a standard C program.
void __stdcall ProcessEvent (params..)
{
//Do some work..
func(); //Call the C# callback now
return;
}
Пожалуйста, сообщите нам, что произойдет. Не удается ли связать связь? Скомпилировать? Сбои? – Arkadiy
Дополнительная информация: Функция не экспортируется и передается функции, которая поступает из заголовка (и DLL связана с файлом lib). Эта функция регистрирует этот обратный вызов, который, как предполагается, будет вызван, когда функция имеет какой-либо вывод. Он компилируется и запускается, но не вызывает обратный вызов. Тем не менее, я пробовал тот же механизм в программе на C, и он работал (был вызван обратный вызов). Вызывающая конвенция, которую я использую, - _stdcall. – Jay
Кроме того, я использую static для обратного вызова (что работает в автономной программе C), но не работает из DLL. Я использую программу C# для тестирования DLL. (Некоторые экспортируемые функции для вызова DLL из C#) – Jay