1

サード パーティの SDK (OCX) を使用するアプリケーションをコーディングしています。私は C# で SDK を使用していますが、問題なく動作します。ただし、Delphi 2007 の SDK から同じオブジェクトを使用して最も単純なテスト アプリケーションを作成できます。コンパイルは問題ありませんが、特定のポイントに達すると同じマシンで BSOD が発生します。SDK を使用する他のテスト アプリケーションをいくつか実行しましたが、それらは正しく動作するため、SDK が正常にインストールされ、正常に機能していることがわかります。

この特定の SDK を使用しない、私が取り組んでいる他の Delphi プロジェクトは正しく動作します。

この問題を解決する方法についてのアイデアはありますか? Delphi にインストールした OCX を削除して、再度追加する必要がありますか? どうやってそれをしますか?

4

4 に答える 4

3

非常に珍しい問題。Windows NTベースのOSは通常、ユーザーアプリケーション内のリング3で発生する障害を封じ込めるのに非常に優れています。問題のSDKは、カーネルレベルのドライバーを介してハードウェアと対話しますか?また、システムのBSOD時に画面に表示される情報。これは、問題の性質に関する手がかりになる場合があります(たとえば、割り込みハンドラーの再入可能性の問題、ハードウェアの障害、割り込みの競合)。Dialogicボードでこの種の問題が発生することがあります。問題は、ドライバーに関連しないカーネルレベルの障害である可能性もあります。

追加の詳細がなければ、原因について推測する以上のことを行うことは困難です。これはFPUの文章題ではないと思う傾向がありますが、間違っている可能性があります。FPU制御ワードの問題は例外を引き起こす可能性がありますが、例外は、OSによってキャッチおよび処理されないドライバーなどの重要な実行コンテキストで発生する必要があります。

FWIW Delphi JNIライブラリでFPU制御ワードの問題が発生し、JVMとホストアプリケーションがクラッシュしました。修正は、NineBerryによって提案されたように、制御ワードを変更および復元するコードで呼び出しを明示的にラップすることでした。これは、アプリケーションがマルチスレッドでない場合に機能します。

于 2009-06-02T03:04:34.233 に答える
2

これは Kaspersky アンチウイルスが原因であることが判明しました。クラッシュ ダンプに対してWindbgを実行して追跡したところ、 kl1.dll を指していました。周りを検索した後、Kaspersky として特定されたこの記事を突き止めました。Kaspersky を無効にしたら、BSOD は発生しなくなりました。

于 2009-06-02T10:36:23.080 に答える
1

浮動小数点例外が問題を引き起こす可能性があります。ほとんどのランタイム環境では浮動小数点例外が無効になっていますが、Delphi では有効になっています。

浮動小数点例外を無効にするには、次のコードを使用します。

Set8087CW($133f); 

これにより、独自のコードの動作も変更されることに注意してください。浮動小数点計算でエラーが発生した場合、例外は発生しなくなり、結果変数は NaN、Inf+、または Inf- のいずれかに設定されます。

于 2009-06-02T00:53:19.960 に答える
0

他のアプリケーションからSDKを正常に使用できるからといって、本質的に問題がないことを意味するわけではありません。正式には何も含まれていないメモリの内容を想定して、特定のデータ項目または存在してはならない項目にさえ悪い反応を示している可能性があります。

初期化されていないデータ項目が原因でバグが発生し、メモリ内の値を取得するだけで、問題のデータ領域が渡される可能性があります(たとえば、レコードのパディングバイト)。構造...)

于 2009-06-02T03:49:17.687 に答える