forest-321 Ответов: 1

Приложение 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 работает?

1 Ответов

Рейтинг:
0

KarstenK

Как я понимаю ваш код проблема заключается в следующем

fn_init_engine()
функция и она будет находиться в начале потока
handle_alarm_management
запуск. Напишите какой-нибудь вывод.

Обычно вы должны отлаживать его, когда оба двоичных файла являются отладочной сборкой. В моем "малом знании" о cygwin я знаю только, что MFC и cygwin имеют проблемы, когда обе среды выполнения показывают окна.


forest-321

Спасибо Вам за ваше решение.