4


プログラムが突然存在し、理由がわかりませんが、コードのどの部分がこの問題を引き起こしているかはわかっています。何が起こるかを説明しようと思います...

まず、一般的な名前空間に加えて、Windows フォームで次の名前空間を使用します。

using System.Diagnostics;
using System.IO;
using System.Data.OleDb;

最大IDを見つけて1ずつインクリメントすることにより、現在の自動インクリメント行IDを取得するカスタム関数があります。

void getCurrentQuestionNo()
{
    //calculate current questionNo based on DB Info
    classDataLayer DL = new classDataLayer();
    OleDbCommand cmd = new OleDbCommand();
    cmd.CommandText = "SELECT MAX([questionID]) FROM questions";
    DataSet ds = DL.select(cmd);
    questionNo = Convert.ToInt32(ds.Tables[0].Rows[0][0]) + 1;
}

この関数は form_load 関数内で起動され、後で使用するために questionNo というグローバル変数を設定します。

また、Microsoft Word アプリケーションのインスタンスを開く次のコードがあります。このコードは、ボタンのクリック イベント内に配置されます。

try
{
    //copy an instance of empty question template to Temp folder
    File.Copy(@"Templates\EmptyQuestion.docx", @"Temp\TempQuestion.docx", true);
    //launch ms-word to open the document
    ProcessStartInfo startInfo = new ProcessStartInfo();
    startInfo.FileName = "WINWORD.EXE";
    startInfo.Arguments = @"Temp\TempQuestion.docx";
    Process.Start(startInfo);
}
catch (Exception ex)
{
    MessageBox.Show(ex.Message, "error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}

問題:
最後の questionNo を取得するためのコードと Word 文書を開くためのコードのどちらも、別々に正常に機能します。つまり、form_load 内で getCurrentQuestionNo() を呼び出すと機能し、問題はありません。form_load 内の getCurrentQuestionNo() 関数を無効にすると、ワード プロセスを起動するコードが正常に機能します。
ただし、form_load 内で getCurrentQuestionNo() を呼び出し、ボタンをクリックしてワード プロセスを起動すると、すべてが機能しますが、数秒後に突然プログラム全体がメッセージなしで終了し、ワードは実行されたままになります。Visual Studio IDE から停止ボタンを押したようなものです。
何が間違っている可能性がありますか?

これは出力ウィンドウに表示されます:
タイプ 'System.IO.IOException' の最初のチャンス例外が mscorlib.dll で発生しました
プログラム '[5032] test.vshost.exe: Program Trace' はコード 0 (0x0) で終了しました。
プログラム '[5032] test.vshost.exe: Managed (v4.0.30319)' はコード -2147483645 (0x80000003) で終了しました。

多くのケースをテストしましたが、プロセスの使用とともに oleDB を使用すると、同じ問題が発生します。コードを次のように減らしました:
最後の自動インクリメント ID を取得するためのコード:

OleDbConnection con1 = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=db.accdb");
OleDbCommand cmd1 = new OleDbCommand("SELECT MAX([questionID]) FROM questions", con1);
con1.Open();
txtID.Text = cmd1.ExecuteScalar().ToString();
con1.Close();

およびプロセスを起動するためのコード:

Process p = new Process();
p.StartInfo.FileName = "notepad.EXE";
p.Start();

それらを 2 つの別々のボタンのクリック イベント内に配置しました。繰り返しますが、各ボタンは単独でクリックすると正しく機能しますが、ボタン1をクリックしてからボタン2をクリックするとプログラムがクラッシュします!!!
私は本当に混乱しています... :(
興味深いことに、プログラムが自動的に終了せず、すべてが動作し続けることがありますが、そのような場合、プログラムを通常どおり閉じると、「vshost.exeが動作を停止しました」というダイアログボックスが表示されます. 問題詳細は、ntdll.dll が障害モジュールであり、場合によっては clr.dll であることを示しています。これも取得します: 障害モジュール名: StackHash_4d02

4

1 に答える 1

0

あなたの問題がDLLの破損にあるとは思えません。DLL が見つからないか、32/64 ビットのミスマッチである可能性が高いと思います。Dependency Walkerのコピーをダウンロードし、アプリに対して実行します。DLL が見つからない場合、または Windows が検出した DLL がアーキテクチャと一致しない場合は、それが通知されます。アプリの正しいバージョン (32 ビットと 64 ビット) を確認してダウンロードしてください。

于 2013-10-04T22:02:07.270 に答える