使用GetSaveFileName()函数,进程不能退出

时间:2022-08-15 20:35:38
使用GetSaveFileName()函数,取得文件名后,关闭窗口,进程不能退出。用spy++查看,还有三个线程在,一个等待状态,二个无效状态,不知道是啥原因
::OPENFILENAME file={0};
WCHAR FileName[MAX_PATH]={0};
file.lStructSize=sizeof(file);
file.hwndOwner=hWnd;
file.lpstrFile=FileName;
file.nMaxFile=sizeof(FileName);
file.nFilterIndex=1;
file.Flags=OFN_ALLOWMULTISELECT|OFN_EXPLORER;
file.lpstrFilter=_T("TextFiles(*.txt)\0*.txt\0AllFiles\0*.*\0\0");
::GetOpenFileName(&file);

7 个解决方案

#1


重新创建了一个win32的工程,使用静态MFC的库,重新编译就没有问题了;不知道啥子原因,
刚开始创建的是控制台的应用程序,难道控制台的程序不支持多线程?
还有一个问题,就是在选择win32项目的时候,MFC的复选框是灰的,选不上,编译的时候通不过,
选者使用静态MFC,编译通过了,运行出错;这时在选择使用Windows标准库,编译也能通过,运行
也没有问题。搞不懂为什么;

#2


除非你真的知道原理,
你开发的win32程序中不要用任何MFC相关的东西,只能用纯API式的调用才行。实在要面向对象一类的技术,可以用原生的C++/COM/ATL接口。

#3


MFC模块在加载和退出时要做联合初始化和清退的。这些工作你用win32的话都没有去做。如果手工去做的话又没法保证版本兼容。

#4


等了3天了,就你够朋友,十分感谢
还有个问题:如何去掉,控制台程序的黑框?子系统改为Windows的话,也有上面的问题,线程不能退出

#5


你是不是在主线程中exitthread了?
用exitprocess或winmain函数返回.
很多windows函数会开启线程的.

#6


引用 4 楼 rock178 的回复:
等了3天了,就你够朋友,十分感谢
还有个问题:如何去掉,控制台程序的黑框?子系统改为Windows的话,也有上面的问题,线程不能退出

不要用MFC吧。。。非要用的话就整个工程都用MFC写。
MFC的exe调用win32的dll是可以的;反过来则不行;
不要黑框的话,改用winmain作主函数,而不是main。
windows子系统的可以另外开黑框的,也可以不开;但是用main的话一开始就会有黑框。

#7


嗯,谢谢,学习了

#1


重新创建了一个win32的工程,使用静态MFC的库,重新编译就没有问题了;不知道啥子原因,
刚开始创建的是控制台的应用程序,难道控制台的程序不支持多线程?
还有一个问题,就是在选择win32项目的时候,MFC的复选框是灰的,选不上,编译的时候通不过,
选者使用静态MFC,编译通过了,运行出错;这时在选择使用Windows标准库,编译也能通过,运行
也没有问题。搞不懂为什么;

#2


除非你真的知道原理,
你开发的win32程序中不要用任何MFC相关的东西,只能用纯API式的调用才行。实在要面向对象一类的技术,可以用原生的C++/COM/ATL接口。

#3


MFC模块在加载和退出时要做联合初始化和清退的。这些工作你用win32的话都没有去做。如果手工去做的话又没法保证版本兼容。

#4


等了3天了,就你够朋友,十分感谢
还有个问题:如何去掉,控制台程序的黑框?子系统改为Windows的话,也有上面的问题,线程不能退出

#5


你是不是在主线程中exitthread了?
用exitprocess或winmain函数返回.
很多windows函数会开启线程的.

#6


引用 4 楼 rock178 的回复:
等了3天了,就你够朋友,十分感谢
还有个问题:如何去掉,控制台程序的黑框?子系统改为Windows的话,也有上面的问题,线程不能退出

不要用MFC吧。。。非要用的话就整个工程都用MFC写。
MFC的exe调用win32的dll是可以的;反过来则不行;
不要黑框的话,改用winmain作主函数,而不是main。
windows子系统的可以另外开黑框的,也可以不开;但是用main的话一开始就会有黑框。

#7


嗯,谢谢,学习了