0

この質問に関連しています。以下の問題を解決するためのアドバイスはありますか?

プログラムで多くの実験をした後、私はいくつかのことを発見しました。

  1. コード行を実行すると、比較的一貫して(90%程度の確率で)クラッシュしますSet Message = New CAPICOM.EncryptedData。この上の行は単なる。であることに注意してくださいDim Message As CAPICOM.EncryptedData

  2. その呼び出しを行う関数は、プログラムの実行の早い段階で呼び出されてもクラッシュしません。エラーの二分探索は問題を見つけるために機能しません。不思議な場所で関数を呼び出すと、バグの発生が確実に防止されるためです。バグが発生した場合、プログラムの再構築が影響を与えるように見えることがあります。はい、それは特異なバグです。同じ問題は、エラーの一時的な二分探索にも当てはまります。プログラムの2つのバージョンを比較するために5時間費やすと、現在症状を示しているのは1つだけですが、両方のバージョンにバグがあることがわかります。生産性はあまり高くありません。

  3. クラッシュはアクセス違反によるものです0xC00000005

  4. WinDbg(Windowsデバッガー)を実行すると、このメモリ位置を読み取るコードが1行しかないことがわかりますLoadPicture(szTmpBMP)。これは、リソースから画像を取得して一時ファイルに貼り付ける恐ろしい関数の最後に呼び出されます。私はこの関数を十分に怖がっていたので、テストのために、への呼び出しに置き換えてからLoadPicture("testcra.bmp")、そのビットマップの恐ろしいリソース関数を呼び出さなかった。これは役に立ちませんでした。このloadpictureの呼び出しを完全に削除しても効果はありませんでしたが、デバッガーは影響を受けるメモリが読み取られているポイントを見つけることができず、影響を受けるメモリは同じ場所にありませんでした。このテストはVMで行われたため、一部のメモリ読み取りは必ずしもデバッガーに表示されるとは限りません。

  5. すべてがVista(私のローカルマシンとVista VMの両方)で完全に機能します。アクセス違反はXPでのみ発生します。

  6. VB6バージョン8176、6.0.8169を使用しています

4

1 に答える 1

0

私の現在の解決策は、すべてのcapicomオブジェクトを早期に作成し、最初のインスタンスを超えてcapicom.encrypteddataの新しいインスタンスを作成しないことです。これは機能しますが、根本的な問題が実際に修正された可能性は低いです。

于 2008-12-03T22:03:08.510 に答える