Вызов callback-функции из динамической Dll
От: JekSoft  
Дата: 08.09.08 09:11
Оценка:
Здравствуйте!

Я пишу Dll-плагин, который динамически подгружает MFC-библиотеку (dll). Необходимо из MFC-библиотеки вызывать функцию главной dll-ки. Через экспортируемую функцию MFC-библиотеки я передаю ей адрес необходимой функции, и пытаюсь вызвать эту функцию по нажатию кнопки на форме MFC. Выбрасывается исключение (обращение по указанному адресу недопустимо), в результате программа закрывается. Есть ли какие то ограничения по передаче адресов функций? Или что то другое не так?

Вот участки кода:
— основная dll-ка:

typedef void (PASCAL* JekVOID_INT_INT_FUNC)(int, int);

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

        SetCallbacks((JekVOID_INT_INT_FUNC**)MoveTracker);
    }
}

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


— MFC-библиотека:


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

extern "C" void PASCAL EXPORT SetCallbacks(JekVOID_INT_INT_FUNC** moveTracker)
{
    AFX_MANAGE_STATE(AfxGetStaticModuleState())    

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

    form.MoveTracker = (JekVOID_INT_INT_FUNC*)(moveTracker);

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

void CMainForm::OnBnClickedButton2()
{
    AFX_MANAGE_STATE(AfxGetStaticModuleState())
    
    (*MoveTracker)(0, 10000);
}


В дебаге проверял, в функцию SetCallbacks заходит, и адрес вроде как верный у функции MoveTracker.
Заранее благодарю за помощь.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.