MFCDLL中使用CFileDialog,会导致程序退出时异常,什么原因?

coyer 2010-11-08 01:37:45
创建一个主程序,在该主程序的某个函数中,做如下事情:

1 hDll = LoadLibrary(_T("test.dll"));
2 TestFunProc proc = GetProcAddress(hDll, "TestFun");
3 proc();

test.dll直接由向导生成,MFC DLL。然后添加并导出一个函数TestFun。

void TestFun()
{
CFileDialog dlg(TRUE);
dlg.DoModal();
}


运行主程序,能够弹出对话框,但是主程序在退出的时候,会发生异常,这是很奇怪的一个事情。大家有谁碰到过这个问题吗?
...全文
345 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
wenh7788 2010-11-24
  • 打赏
  • 举报
回复
一句话 静态中使用mfc
野男孩 2010-11-12
  • 打赏
  • 举报
回复
lz就把自己的工程压缩一下,找个上传网站一放,让大家看看不就清楚了。。。。
black_wings 2010-11-12
  • 打赏
  • 举报
回复
CFileDialog会改变当前目录,使用完毕回复当前目录。
lazy_2010 2010-11-08
  • 打赏
  • 举报
回复
建议:
1、void OpenFileDlg(); 函数建议修改成 BOOL OpenFileDlg();

2、最好申明是 __cdecl 或者 WINAPI;

我使用 BOOL ... __cdecl 测试了,没有问题。
visualwind 2010-11-08
  • 打赏
  • 举报
回复
我测试了,我这里没有报任何错。

DLL就是MFC shared DLL
TestFun输出写在def文件里面。
主程序是新建的单文档工程。
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CMDIFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;

if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
{
TRACE0("Failed to create toolbar\n");
return -1; // fail to create
}

if (!m_wndStatusBar.Create(this) ||
!m_wndStatusBar.SetIndicators(indicators,
sizeof(indicators)/sizeof(UINT)))
{
TRACE0("Failed to create status bar\n");
return -1; // fail to create
}

// TODO: Delete these three lines if you don't want the toolbar to be dockable
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndToolBar);

//就这么写的退出没什么异常
typedef void (*TestFunProc)();
HINSTANCE h = LoadLibrary(_T("test.dll"));
TestFunProc proc = (TestFunProc)GetProcAddress(h, "TestFun");
proc();

return 0;
}


[Quote=引用 12 楼 coyer 的回复:]

这些简单问题,我考虑过了。

同志,你按我说的,写个测试Demo吧,很快的,1分钟就好。

测试函数定义为:
typedef void (*OpenFileDlgProc)(CWnd* parent);

引用 11 楼 visualwind 的回复:

把CFileDialog构造的参数都填上,特别是pParentWnd
[/Quote]
coyer 2010-11-08
  • 打赏
  • 举报
回复
这些简单问题,我考虑过了。

同志,你按我说的,写个测试Demo吧,很快的,1分钟就好。

测试函数定义为:
typedef void (*OpenFileDlgProc)(CWnd* parent);

[Quote=引用 11 楼 visualwind 的回复:]

把CFileDialog构造的参数都填上,特别是pParentWnd
[/Quote]
visualwind 2010-11-08
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 coyer 的回复:]

楼上几位,主程序也是向导生成的Demo,啥都没干,就加了我说的调用Dll的那几行代码。不信的话,大家自己写个Demo测试一下不就知道了。向导生成代码不到1分钟。
[/Quote]

把CFileDialog构造的参数都填上,特别是pParentWnd
副组长 2010-11-08
  • 打赏
  • 举报
回复
记得好像遇到过CFileDialog在DLL中一闪就过去,停不下的情况。记得好像是资源方面的问题。
coyer 2010-11-08
  • 打赏
  • 举报
回复
_crtExitProcess里面,没法跟踪。

我做c/c++,vc/mfc 都快十年了。应该不是我的的代码错误。

[Quote=引用 7 楼 tiger9991 的回复:]
断点到你程序析构的地方,如果跳出异常,查看Call Stack可以查找原因
[/Quote]
coyer 2010-11-08
  • 打赏
  • 举报
回复
楼上几位,主程序也是向导生成的Demo,啥都没干,就加了我说的调用Dll的那几行代码。不信的话,大家自己写个Demo测试一下不就知道了。向导生成代码不到1分钟。

傻X 2010-11-08
  • 打赏
  • 举报
回复
断点到你程序析构的地方,如果跳出异常,查看Call Stack可以查找原因
qsycn 2010-11-08
  • 打赏
  • 举报
回复
你先注释掉TestFun里面的代码试试看是否是这个地方出了问题

如果是,那说明应该是跨模块分配内存创建窗口造成的
在DestroyWindow处会出错

跨模块内存分配解决方法很多,google一下即可
visualwind 2010-11-08
  • 打赏
  • 举报
回复
那就应该是你的程序其他地方的问题,你得仔细检查一下有没有内存异常的地方。

[Quote=引用 4 楼 coyer 的回复:]

没用的,我都试过了。主程序退出会异常。我用vs2005和2008都试过了。

void OpenFileDlg()
{
//AFX_MANAGE_STATE(AfxGetAppModuleState());
//AFX_MANAGE_STATE(AfxGetStaticModuleState());

CFileDialog dlg(TRUE);
dlg.DoModal();
……
[/Quote]
coyer 2010-11-08
  • 打赏
  • 举报
回复
没用的,我都试过了。主程序退出会异常。我用vs2005和2008都试过了。

void OpenFileDlg()
{
//AFX_MANAGE_STATE(AfxGetAppModuleState());
//AFX_MANAGE_STATE(AfxGetStaticModuleState());

CFileDialog dlg(TRUE);
dlg.DoModal();
}

[Quote=引用 1 楼 visualwind 的回复:]
TestFun里面第一行用AFX_MANAGE_STATE(AfxGetAppModuleState());切换资源
[/Quote]
visualwind 2010-11-08
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 lsupper 的回复:]

TestFunProc 的定义要为_stdcall 检查下.......
[/Quote]

这个不一定,只要TestFunProc定义和TestFun一致就行了。
lsupper 2010-11-08
  • 打赏
  • 举报
回复
TestFunProc 的定义要为_stdcall 检查下.......
visualwind 2010-11-08
  • 打赏
  • 举报
回复
TestFun里面第一行用AFX_MANAGE_STATE(AfxGetAppModuleState());切换资源

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧