我刚刚修改了我的 C++/CLI 项目以更改它解析其 config.ini 文本文件的方式。但它仍然像以前一样访问磁盘上的文件:
StreamReader ^sr = gcnew StreamReader(CONFFILE_NAME);
String ^rdfl = sr->ReadToEnd();
sr->Close();
现在它不会在 VS2008Express 环境之外运行。它是一个伪装成服务的 WinForm,应该保留在通知托盘中,但它只是在那里闪烁其默认图标,直到我将鼠标悬停在它上面,这是它已经异常终止的肯定标志。顺便说一句,默认图标应立即更新,因此我将再次检查该点。我刚刚尝试过清洁和重建。
谢谢。
_编辑_
如果配置文件不存在或不兼容,它运行良好 - 出现一个窗口,我输入正确的配置,然后她就走了。但它会从 VS2008 内部的文件重新加载配置数据,并且它过去常常从外部加载(尽管在编码中存在重大逻辑错误)。
这是紧随上面发布的代码:
int fore = 0;
int aft;
while (statsRead < 4) {
fore = rdfl->IndexOf(':', aft)+1;
if (fore == -1) break;
aft = rdfl->IndexOf('\n', fore);
if (aft == -1) break;
if (statsRead == 0) str1 = rdfl->Substring(fore, aft-fore)->Trim();
else if (statsRead == 1) str2 = rdfl->Substring(fore, aft-fore)->Trim();
else {
String ^tmpIntStr = rdfl->Substring(fore, aft-fore)->Trim();
int tmp_int;
if (Int32::TryParse(tmpIntStr, tmp_int)) {
switch (statsRead) {
case 2: int1 = tmp_int; break;
case 3: int2 = tmp_int; break;
}
} else break;
}
++statsRead;
}
}
之后,除了第一个触发窗口之外,所有剩余的统计信息都被赋予了在我的情况下有效的默认值。
_编辑_
我已经用 Hans 提倡的 try 和 catch 块以及 StreamReader 的 MSDN 文献更新了上述内容,但仍然失败,堆栈跟踪(谢谢,Hans)表明错误是我的while
陈述(不,谢谢,MS)
if (File::Exists(CONFFILE_NAME)) {
String ^rdfl;
try {
StreamReader ^sr = gcnew StreamReader(CONFFILE_NAME);
try{
rdfl = sr->ReadToEnd();
} finally {
if ( sr )
delete (IDisposable^)sr;
}
} catch (Exception ^ex) {
MessageBox::Show(ex->Message);
}
int fore = 0;
int aft;
while (statsRead < 4) {
fore = rdfl->IndexOf(':', aft)+1;
if (fore == -1) break;
aft = rdfl->IndexOf('\n', fore);
if (aft == -1) break;
if (statsRead == 0) str1 = rdfl->Substring(fore, aft-fore)->Trim();
else if (statsRead == 1) str2 = rdfl->Substring(fore, aft-fore)->Trim();
else {
String ^tmpIntStr = rdfl->Substring(fore, aft-fore)->Trim();
int tmp_int;
if (Int32::TryParse(tmpIntStr, tmp_int)) {
switch (statsRead) {
case 2: int1 = tmp_int; break;
case 3: int2 = tmp_int; break;
}
} else break;
}
++statsRead;
}
}