我在windows目录的win.ini文件中放置了一个自定义条目,在自定义[Login]部分下名为LoginCount,并在每次加载主视图时递增.在Form Create事件中,我访问win.ini并检查其值,如果达到1000,我会显示一条消息.但是发生了一件非常奇怪的事情.达到1000后,我手动将其值设置为0.但它仍然显示1000.我检查了路径,以防应用程序引用系统中的某个其他win.ini文件,但它是C:\ Windows\win.ini .这是代码:
procedure TfMain.FormCreate(Sender: TObject);
var
winIni: TIniFile;
windir_buf: array [0 .. 144] of Char;
WINDIR: string;
loginCount: integer;
begin
GetWindowsDirectory(windir_buf, sizeof(windir_buf));
WINDIR := StrPas(windir_buf) + '\';
ShowMessage(WINDIR+'win.ini');//Shows C:\Windows\win.ini
winIni := TIniFile.Create(WINDIR + 'Win.ini');
loginCount := winIni.ReadInteger('Login', 'LoginCount', 1);
ShowMessage(IntToStr(loginCount));//Shows 1000 although it's 0 in the actual file.
end;
Run Code Online (Sandbox Code Playgroud)
知道为什么吗?
这可能是由于文件系统虚拟化造成的.您正在Vista或更高版本下运行虚拟化进程,并且没有对Windows目录的写入权限.
调试这个没有意义.Win.ini文件已被弃用近20年.你应该:
如果您根本无法停止使用Win.ini,那么您仍然需要使用requireAdministrator选项添加清单.
如果你打算使用Win.ini(而且我无法表达你多么厌恶你考虑这样做的事实)那么你应该使用GetProfileString和SetProfileString.由于文件是共享的,因此您需要使用同步该访问的函数来访问它.