Re: Вызов callback-функции из динамической Dll
От: VoidEx  
Дата: 08.09.08 09:23
Оценка:
Здравствуйте, JekSoft, Вы писали:

JS>Здравствуйте!


Здравствуй!

JekVOID_INT_INT_FUNC уже означает "указатель на функцию..."
Ты же зачем-то принимаешь в SetCallbacks тип
JekVOID_INT_INT_FUNC**
(указатель на указатель на указатель на функцию)
А хранишь
JekVOID_INT_INT_FUNC*
(указатель на указатель на функцию)

Тебе нужно исправить код так:

JS>

JS>typedef void (PASCAL* JekVOID_INT_INT_FUNC_PTR)(int, int);

JS>static void LoadWindowLibrary()
JS>{
JS>    lib = LoadLibrary(dllFileName);
JS>    if (lib != NULL)
JS>    {
JS>        InitMainWindow = (JekVOID_VOID_FUNC)GetProcAddress(lib, "InitMainWindow");
JS>        SetCallbacks = (JekVOID_LPVOID_FUNC)GetProcAddress(lib, "SetCallbacks");

JS>        SetCallbacks(&MoveTracker);
JS>    }
JS>}

JS>extern "C" void static PASCAL MoveTracker1(int dx, int dy)
JS>{
JS>    MessageBox(NULL, "Test", "Test", MB_ICONINFORMATION);
JS>    pMyPlugin->MoveTracker(dx, dy);
JS>}
JS>


JS>- MFC-библиотека:


JS>

JS>JekVOID_INT_INT_FUNC_PTR MoveTracker; // объявлена в MainForm.h внутри класса формы.

JS>extern "C" void PASCAL EXPORT SetCallbacks(JekVOID_INT_INT_FUNC_PTR moveTracker)
JS>{
JS>    AFX_MANAGE_STATE(AfxGetStaticModuleState())    

JS>    MessageBox(NULL, "MoveTracker", "Start", MB_ICONERROR);

JS>    form.MoveTracker = moveTracker;

JS>    if (form.MoveTracker == NULL)
JS>        MessageBox(NULL, "MoveTracker", "Error", MB_ICONERROR);
JS>    else
JS>        MessageBox(NULL, "MoveTracker", "End", MB_ICONERROR);
JS>}

JS>void CMainForm::OnBnClickedButton2()
JS>{
JS>    AFX_MANAGE_STATE(AfxGetStaticModuleState())
    
JS>    (*MoveTracker)(0, 10000);
JS>    // MoveTracker(0, 10000);
JS>    // Можно и так, и так.
JS>}
JS>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.