0

我刚刚修改了我的 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;
    }
}
4

1 回答 1

1

这通常是一个简单的错误,例如 CONFFILE_NAME 不是完整路径名,并且默认工作目录未设置在您希望的位置。专注于附加调试器。这在 .NET 中很容易,例如在 Main() 方法中使用 System::Diagnostics::Debugger::Launch()。并为 AppDomain::CurrentDomain->UnhandledException 编写一个事件处理程序,以便异常不会在没有通知的情况下落入位桶。请务必删除不应该存在的 try/catch 语句。

于 2011-09-02T22:02:33.520 回答