【发布时间】:2015-04-27 06:12:16
【问题描述】:
最近遇到一个小问题,在尝试读取 .ini 文件时导致访问冲突。
我的问题是,我可以在同一个过程中加载多个 .ini 文件(例如 settings.ini 和 data.ini)吗?例如,我有两个 ini 文件,我写入和读取它们。
这是一个缩短的过程,它写入数据:
//writing to file uninstall.ini
try
ini := TIniFile.Create(edPath.Text + '\Uninstall.ini');
ini.WriteString('Uninstall', 'qfProgramName', Label4.Caption);
ini.WriteString('Uninstall', 'qfUninstPath', edPath.Text);
finally
ini.Free;
end;
然后,有这个代码(在同一过程中)
configini := configini.Create(ExtractFilePath(Application.ExeName) + '\quickfix.ini');
sectionsCount := getMaxSectionIndex(ExtractFilePath(Application.ExeName) + '\quickfix.ini');
startmenuLoc := GetProperDir(_STARTMENU);
desktopLoc := GetProperDir(_DESKTOP);
for I := 1 to sectionsCount do begin
currentSection := 'qfShortcut_' + IntToStr(I);
shortcutFile := configini.ReadString(currentSection, 'qfShTarget', '');
shortcutDesc := configini.ReadString(currentSection, 'qfShDescription', '');
shortcutFullPath := installPath + '\' + shortcutFile;
shortcutDest := configini.ReadString(currentSection, 'qfShPath', '');
displayName := configini.ReadString(currentSection, 'qfDisplayName', '');
showmessage(startmenuLoc + '\' + displayName + '.lnk');
showmessage(shortcutFullPath);
if shortcutDest = 'spStartMenu' then CreateLink(shortcutFullPath, startmenuLoc + '\' + displayName + '.lnk', '', '');
if shortcutDest = 'spDesktop' then CreateLink(shortcutFullPath, desktopLoc + '\' + displayName + '.lnk', '', '');
第二个加载文件的行因访问冲突而崩溃。不排除,问题出在其他地方,不过,我希望你们看看,也许有人会看到另一个问题。
这个 sn-p 用于在桌面和开始菜单中创建快捷方式,从 .ini 文件中加载数据。文件“quickfix.ini”也在 OnCreate 加载一次,但随后被释放。
【问题讨论】:
-
访问冲突发生在哪一行?
-
您的
try不正确。像这样:obj := TObject.Create; try dostuff; finally obj.Free; end;请借此机会学习如何调试。能够自己执行基本调试会更有效率。每次你犯了一个小错误(我们都经常这样做)时都必须问 Stack Overflow 问题是没有效率的。如果您能够进行调试,那么您就会知道哪一行代码引发了访问冲突,并且您就会明白出了什么问题。另一方面,也许您还不知道访问冲突实际上是什么。这些知识是必不可少的。 -
Keith,访问冲突发生在我加载 quickfix.ini 的那一行,但是,即使我注释掉所有其他周围的代码,访问冲突仍然存在。大卫,感谢您的回答,但是,我重新编写了我的尝试语句并且没有任何改变。还有其他想法吗?提前致谢!
-
我没有说尝试是问题所在。那只是一些免费的建议。我仍然不知道错误发生在哪一行。你仍然可以通过一些调试来解决这个问题。你之前有做过调试,还是总是试图通过阅读代码来解决问题?你知道什么是访问冲突吗?不要误会,我试图引导你学习新技能,让你成为更好的程序员。
-
谢谢,大卫,我明白你的意思,我知道什么是访问冲突,但我真的不知道如何调试它,或者如何追踪正确的恶意代码行。我唯一知道的是,这个异常出现在 ini.create(quickfix) 中,因为当我注释掉它时,它再也不会发生了......注意:我的访问冲突是在 00000004