首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

还是FILE_FLAG_DELETE_ON_CLOSE的有关问题

2012-08-26 
还是FILE_FLAG_DELETE_ON_CLOSE的问题现在问题简化,就一个小问题我首先用CreateFile(_T(Project1.dll),

还是FILE_FLAG_DELETE_ON_CLOSE的问题
现在问题简化,就一个小问题
我首先用CreateFile(_T("Project1.dll"), 0, FILE_SHARE_READ|FILE_SHARE_DELETE|FILE_SHARE_WRITE, NULL,OPEN_ALWAYS, FILE_FLAG_DELETE_ON_CLOSE, 0);
打开DLL文件,接着LoadLibrary(_T("Project1.dll"));
现在问题是,如果关闭程序前先FreeLibrary,则程序关闭后DLL被自动删除
但若没有Free,则DLL不能被自动删除。为什么?关闭程序的时候不是会自动FreeLibrary么?而且关闭程序后也没有句柄关联到DLL了啊
求大侠解释啊

额,顺带问一下,NtSetInformationFile不能和NtQueryInformationFile一样在Ring3下调用么?
PFILE_MODE_INFORMATION pfmi;
NtQueryInformationFile
接着pfmi->Mode|=FILE_FLAG_DELETE_ON_CLOSE;
然后NtSetInformationFile,结果失败了……

[解决办法]
"关闭程序的时候不是会自动FreeLibrary么"
可能要等待一段时间,最长15分钟。这是系统防止频繁load。
你过段时间查查看。
[解决办法]
FILE_MODE_INFORMATION不允许设置FILE_DELETE_ON_CLOSE
允许设置的mode只有#define FILE_VALID_SET_FLAGS 0x00000036
而FILE_DELETE_ON_CLOSE=0x00001000

至于为什么退出时不能删文件,是因为windows在进程结束时是先关闭全部的句柄再清理地址空间,而dll的卸载是在清理地址空间中完成,所以先关闭句柄时就不能删除
[解决办法]
DLL_PROCESS_DETACH中UnmapViewOfFile(hdll)

热点排行