Здравствуйте!
Я пишу 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.
Заранее благодарю за помощь.