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;
    }
}

その後、ウィンドウをトリガーする最初の統計を除いて、残りの統計には私の場合に機能するデフォルト値が与えられます。

_編集_

ハンスとStreamReaderのMSDN文学によって提唱されているように、上記をtry and catchブロックで更新しましたが、それでも失敗します。スタックトレース(ありがとう、ハンス)は、障害が私の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 に答える