为什么我在工程中调用dll,该dll仅提供一个显示对话框的功能,当我关闭这个对话框后,整个工程也会数秒后随之关闭,为什么? 我创建了一个基于MFC的dll文件,该dll提供了显示对话框功能,我在对话框中加入了一个关闭对话框的按钮,但是当我把该dll加入到一个基于MFC的exe中(基于单文档)的工程中后,运行工程,点击菜单调用dll,成果显示后,当关闭该dll后,整个工程也会随之关闭。不知道问题出在什么地方?请大侠相救。会有高分答谢!本人MSN:[email protected] 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 估计dll推出导致exe出错了,也跟着退出了,检查一下dll的释放部分代码 //数据库恢复备份 HINSTANCE hDll; hDll=LoadLibrary("BackupDLL.dll"); if (NULL==hDll) { MessageBox("load dll failed!"); return; } typedef void(*pFunShowDlg)(CString); pFunShowDlg pShowDlg; pShowDlg=(pFunShowDlg)GetProcAddress(hDll,"ShowDlg"); if (NULL==pShowDlg) { MessageBox("Function load failed!"); } CString strSQL; strSQL.Format("driver={SQL Server};Server=127.0.0.1;DATABASE=cljkdb;uid=sa;pwd="); pShowDlg(strSQL); FreeLibrary(hDll);以上是我的dll调用和释放代码。 DLL导出MFC资源记得加上AFX_MANAGE_STATE(AfxGetStaticModuleState()) ShowDlg函数怎么写的?EXE与DLL是用相同版本的VC生成的吗? 对话框是模式还是非模式的,如果是非模式的,把FreeLibrary去掉试试看 楼主用的是MFC的DLL吧?首先用MFC的DLL,如果需要弹出对话框messagebox的话,AFX_MANAGE_STATE(AfxGetStaticModuleState())是一定要加上的,另外就是,在MFC中,messagebox是封装过的,不能指定父窗体的hwnd,在对话框弹出后,是不会中断当前进程和线程的,所以,在你点确定后,如果进程或者线程已经执行完成,对话框找不到返回的窗体或者调用者,就会出错了。建议你可以试试用::MessageBox,然后把线程所在的主窗体的hnwd当参数传入,让对话框弹出时,能正常的停止线程,等用户点击确定后,退出线程,应该就不会出这样的问题了。 我同样遇到过,那时做一个外挂,只要卸载DLL,游戏程序就挂掉了,至今不知怎知回事,后来换了种方法。 #include "StdAfx.h"#include "Dllexport.h"#include "DBBackRestore.h"extern "C" __declspec(dllexport) void ShowDlg(const char* strDBCon,const char* strUserName = "who"){ CDBBackRestore BRDlg; BRDlg.m_strDBCon = strDBCon; BRDlg.m_strCurUseName = strUserName; BRDlg.DoModal();}//以上是我的showdlg函数,exe和dll是相同的版本 当我按照上面两位大侠的建议,将FreeLibrary(hDll); 注释掉后,当我关闭dll模块,过将近20秒,会弹出这样的错误。Debug Assertion Failed!program:File:afxcmn.inlLine:272For information on how your program can causean assertion failure, see the Visual C++ on asserts. 函数类型定义错了:typedef void (*pFunShowDlg)(const char*, const char*); 调用时也要改一下:pShowDlg(strSQL, "who"); 修改BOOL CDBBackRestore::OnInitDialog() 函数,逐个屏蔽代码,定位测试点,找个出错语句 这里是肯定要改的,如果还出现问题,说明还有其它错误的地方。你先把DLL这个函数中的代码都注释掉试试,如果这样没有问题,再改成只注释掉BRDlg.DoModal()这行看看。 问题暂时解决。稍后我会总结一下。然后揭帖。感谢各位。特别是ilovedrv帮忙分析调试。 //数据库恢复备份 HINSTANCE hDll; hDll=LoadLibrary("BackupDLL.dll"); if (NULL==hDll) { MessageBox("load dll failed!"); return; } typedef void(*pFunShowDlg)(CString); pFunShowDlg pShowDlg; pShowDlg=(pFunShowDlg)GetProcAddress(hDll,"ShowDlg"); if (NULL==pShowDlg) { MessageBox("Function load failed!"); //如果pShowDlg为NULL,程序还会继续往下走} CString strSQL; strSQL.Format("driver={SQL Server};Server=127.0.0.1;DATABASE=cljkdb;uid=sa;pwd="); pShowDlg(strSQL); //如果pShowDlg为NULL,还会执行这一行FreeLibrary(hDll); 经过调试修改,我将CDirTreeCtrl类中的InsertDriveItem(CString i_strDriveString)函数中调用的LookForChanges(strTemp)给注释掉了,就不会出现我原来所出现的问题。但具体是因为什么我没有搞明白。我看到LookForChanges(strTemp)加载了CloseHandle(hThread)函数,按理说应该没有问题。所有,有用过找个类的朋友,可以看一下这部分,然后给说说其中的原因。 windows api 谁能帮我解决此难关,直接给你我最后76分! 请教ReadDirectoryChangesW的实现原理是什么? 一个普通的程序调试出现错误,大哥快救我啊 高分求助 新手提问:为什么加了对话框后,MessageBox显示不出来? 在一图片框上显示图片的问题 如何改VB中执行文件中的图片? 帮我? 有关拨号时 modem 超时设置的问题 和 判断数据传输问题 100分,急 为何没调用ShowWindow(...),UpdateWindow(...);却可以显示窗口 谁给我推荐一下学习shader的书 VC ADO 添加记录问题
HINSTANCE hDll;
hDll=LoadLibrary("BackupDLL.dll");
if (NULL==hDll)
{
MessageBox("load dll failed!");
return;
}
typedef void(*pFunShowDlg)(CString);
pFunShowDlg pShowDlg;
pShowDlg=(pFunShowDlg)GetProcAddress(hDll,"ShowDlg");
if (NULL==pShowDlg)
{
MessageBox("Function load failed!");
}
CString strSQL;
strSQL.Format("driver={SQL Server};Server=127.0.0.1;DATABASE=cljkdb;uid=sa;pwd=");
pShowDlg(strSQL);
FreeLibrary(hDll);以上是我的dll调用和释放代码。
AFX_MANAGE_STATE(AfxGetStaticModuleState())
#include "StdAfx.h"
#include "Dllexport.h"
#include "DBBackRestore.h"extern "C" __declspec(dllexport) void ShowDlg(const char* strDBCon,const char* strUserName = "who")
{
CDBBackRestore BRDlg;
BRDlg.m_strDBCon = strDBCon;
BRDlg.m_strCurUseName = strUserName;
BRDlg.DoModal();
}
//
以上是我的showdlg函数,exe和dll是相同的版本
Debug Assertion Failed!
program:
File:afxcmn.inl
Line:272For information on how your program can causean assertion failure, see the Visual C++ on asserts.
typedef void (*pFunShowDlg)(const char*, const char*);
pShowDlg(strSQL, "who");
你先把DLL这个函数中的代码都注释掉试试,如果这样没有问题,再改成只注释掉BRDlg.DoModal()这行看看。
//数据库恢复备份
HINSTANCE hDll;
hDll=LoadLibrary("BackupDLL.dll");
if (NULL==hDll)
{
MessageBox("load dll failed!");
return;
}
typedef void(*pFunShowDlg)(CString);
pFunShowDlg pShowDlg;
pShowDlg=(pFunShowDlg)GetProcAddress(hDll,"ShowDlg");
if (NULL==pShowDlg)
{
MessageBox("Function load failed!");
//如果pShowDlg为NULL,程序还会继续往下走
}
CString strSQL;
strSQL.Format("driver={SQL Server};Server=127.0.0.1;DATABASE=cljkdb;uid=sa;pwd=");
pShowDlg(strSQL); //如果pShowDlg为NULL,还会执行这一行
FreeLibrary(hDll);
所有,有用过找个类的朋友,可以看一下这部分,然后给说说其中的原因。