Приложение MFC и cygwin DLL
Привет, друзья.
Я собираюсь вызвать dll, скомпилированную с помощью cygwin в приложении MFC.
Я не мог найти правильный путь.
Что я уже пробовал:
Например, заголовочный файл моей библиотеки dll выглядит следующим образом:
#ifndef _MYDLL_H_ #ifdef __cplusplus extern "C" { #endif extern int(* fn_err_msg)(const char*, int type); void init_engine(); void register_err_func(char(*lpErrorFunc)(const char* msg, char type)); #ifdef __cplusplus } #endif #endif // _MYDLL_H_
Исходный файл моей библиотеки dll выглядит следующим образом:
... void register_err_func(char(*lpErrorFunc)(const char* msg, char type)) { fn_err_msg = lpErrorFunc; out_debug("registered msg function."); } void out_debug (const char *message, ...) { if (fn_err_msg == NULL) { va_list args; fprintf(stderr, "MYDLL_DEBUG: "); va_start(args, message); vfprintf(stderr, message, args); va_end(args); fprintf(stderr, ".\n"); } else { char pszErrorMsg[1024] = ""; va_list args; va_start(args, message); vsprintf(pszErrorMsg, message, args); va_end(args); (fn_err_msg)(pszErrorMsg, eMsgDebug); } } void init_engine() { out_debug("init_eninge"); pthread_t thread1; // Init the session mutex pthread_mutex_init(&session_mutex, NULL); pthread_create(&thread1, NULL, handle_alarm_management, NULL); // To handle exit signals signal(SIGINT, signal_handler); signal(SIGQUIT, signal_handler); return 0; } ...
make-файл есть ...
НКУ -О3 -спос -общая -F-функцию-разделы-я в/usr/включать -DHAVE_CONFIG_H -с мыши mydll.с-о ..\ОГРН/мыши mydll.о-МД-МФ ..\ОГРН/мыши mydll.ДЭП
г++ -общие-о \..bin/mydll.dll -ЧШ,-ГК-разделы ..\ОГРН/мыши mydll.о
код приложения mfc выглядит следующим образом:
//////////////////////////////////////////////// // Example.cpp //////////////////////////////////////////////// ... HINSTANCE m_hCygwinInst; typedef void(*pFnCygWinInit)(); extern pFnCygWinInit fn_cygwin_init; BOOL CExample::InitInstance() { m_hCygwinInst = LoadLibrary("cygwin1.dll"); if (m_hCygwinInst == NULL) return FALSE; fn_cygwin_init = (pFnCygWinInit)GetProcAddress(m_hCygwinInst, "cygwin_dll_init"); if (fn_cygwin_init == NULL) return FALSE; ... } //////////////////////////////////////////////// // ExampleDlg.cpp //////////////////////////////////////////////// ... typedef void(*pFnInitEngine)(); typedef void(*pFnRegErrFunc)(char(*lpErrorFunc)(const char* msg, char type)); pFnInitEngine fn_init_engine = NULL; pFnRegErrFunc fn_reg_err_func = NULL; HINSTANCE m_hDllInst = NULL; CExampleDlg* g_pMain = NULL; ... char report_msg(const char* psz_msg, char type) { if (g_pMain) g_pMain->add_msg(psz_msg, type); return 0; } BOOL CExampleDlg::init_funcs() { BOOL bRes = FALSE; g_pMain = this; m_hDllInst = LoadLibrary("mydll.dll"); if (m_hDllInst == NULL) return bRes; fn_init_engine = (pFnInitEngine)GetProcAddress(m_hDllInst, "init_engine"); fn_reg_err_func = (pFnRegErrFunc)GetProcAddress(m_hDllInst, "register_err_func"); if (!fn_init_engine || !fn_reg_err_func) { return bRes; } bRes = TRUE; return bRes; } BOOL CExampleDlg::OnInitDialog() { ... g_pMain = this; if (init_funcs()) { (fn_cygwin_init)(); // (1) (fn_reg_err_func)(report_msg); // (2) (fn_init_engine)(); // (3) } else { AfxMessageBox(_T("Error!!!")); CDialogEx::OnCancel(); return FALSE; } return TRUE; } void CExampleDlg::add_msg(const char* pszMsg, int type) { int n = m_lstMsgs.GetItemCount(); CString s; s.Format(_T("%d"), n + 1); m_lstMsgs.InsertItem(n, s); if (pszMsg) { CA2T pss(pszMsg); m_lstMsgs.SetItemText(n, 1, pss.m_psz); } }
(1), (2): Правильно (3: прокомментировано)
(1), (3): Правильно (2: прокомментировано)
(1), (2), (3): не имеет ответа.
но, если код изменен следующим образом, это нормально.
char report_msg(const char* psz_msg, char type) { // if (g_pMain) // g_pMain->add_msg(psz_msg, type); return 0; }
В чем же причина? Как я могу это исправить?
Спасибо.
Richard MacCutchan
Причина чего? Ваш вопрос неясен.
forest-321
во-первых, причина отсутствия ответа.
во-вторых, как вызвать dll, скомпилированную с помощью cygwin в приложении MFC.
forest-321
что такое cygwin dll init работает?