1


0

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

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

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

4 Answer


3


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

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

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


2


これはKasperskyアンチウイルスが原因であることがわかりました。 私はクラッシュダンプに対して Windbgを実行することによってそれを追跡し、それはkl1.dllを指していました。 私はそれをKasperskyと識別した。 Kasperskyを無効にしたのでBSODが発生しなくなりました。


1


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

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

Set8087CW($ 133f)。

これにより、あなた自身のコードの振る舞いも変わることに注意してください。 浮動小数点計算でエラーが発生した場合は、これ以上例外は発生しません。代わりに、結果変数はNaN、Inf、またはInf-に設定されます。


0


SDKを他のアプリケーションから問題なく使用できるからといって、本質的に問題がないわけではありません。 形式的には何も含まれていないメモリの内容を想定すると、特定のデータ項目や存在してはいけない項目に対してさえひどく反応しているかもしれません。

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