2009-11-05 4 views
2

У меня есть обратный вызов внутри 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; 
} 
+0

Пожалуйста, сообщите нам, что произойдет. Не удается ли связать связь? Скомпилировать? Сбои? – Arkadiy

+0

Дополнительная информация: Функция не экспортируется и передается функции, которая поступает из заголовка (и DLL связана с файлом lib). Эта функция регистрирует этот обратный вызов, который, как предполагается, будет вызван, когда функция имеет какой-либо вывод. Он компилируется и запускается, но не вызывает обратный вызов. Тем не менее, я пробовал тот же механизм в программе на C, и он работал (был вызван обратный вызов). Вызывающая конвенция, которую я использую, - _stdcall. – Jay

+0

Кроме того, я использую static для обратного вызова (что работает в автономной программе C), но не работает из DLL. Я использую программу C# для тестирования DLL. (Некоторые экспортируемые функции для вызова DLL из C#) – Jay

ответ

1

Ваш вопрос немного запутанным. Вы говорите, что у вас есть неэкспортируемая функция в DLL, которую вы хотите взять по адресу и передать какой-то внешний код, который вызовет его обратно? Это вполне разумно. Если это не работает, вот на что посмотреть.

1) Убедитесь, что соглашение о вызове корректно относится к определению функции, типу указателя функции в вашей DLL и типу указателя функции, как указано во внешнем коде.

2) В вашей DLL, попытка вызвать обратный вызов через то же функцию указателя , что вы передаете к внешнему коду.

3) Если (1) является правильным и (2) работает, затем запустите свой отладчик, поместите контрольную точку в строке, где вы пытаетесь вызвать обратный вызов из внешнего кода, а затем переходите к разборке. Пройдите через звонок и посмотрите, где он заканчивается.

+0

(1), и (2) работает, и, к сожалению, у меня нет доступа к стороннему коду, который вызывает обратный вызов. – Jay

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