• ベストアンサー

VC++で作成したソフトを実行するとエラーが出ます。

お世話になります。 初心者です。 OS XP、VC++ 6.0で開発しています。 今、RS232C通信用ソフト(MFC)を作成したのですが、ビルドもNo ErrorでOKでXP上では動いているのですが、Windows 2000 Profetionalでそのソフトを使用して、RS232C通信をしながらマイコン開発用のコンパイラでマイコンソフトのDebugをしているのですが、時々下記のコメントが出て、作成したRS232C通信用ソフトが勝手に落ちます。 何が問題なのでしょうか。 お力を貸していただけませんでしょうか。 "0x77fcb491"の命令が"0x00000038"のメモリを参照しました。メモリが"write"になることはできませんでした。プログラムを終了するには[OK]をクリックしてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • goosyu
  • ベストアンサー率58% (36/62)
回答No.3

>ClearCommError関数にて、16というエラー値を得ました。 ClearCommError関数でCE_BREAK(16)ということはハードウェアでブレーク信号を検出したことになります。ブレーク信号を検出すると該当する処理があれば対応させる必要がありますがXpのときに意識していないのであれば,単純に通信異常かもしれません。受信バッファをクリアするなどの処理が必要です。(通信ロジックが不明の為詳細にはわかりませんが・・・),いずれにせよClearCommError関数を再度コールしてエラーが無くなる状態まで面倒を見る必要があります。またブレーク信号検出時の処理があれば,そこに問題があるのかもしれません。

cpptext
質問者

お礼

お世話になります。 なるほど! ブレーク信号というのがあるんですね。 確かに、接続先の機器を落とすとソフトが落ちるので、その可能性が濃厚です。 CHECKしてみます。 ありがとうございました。

その他の回答 (2)

  • titokani
  • ベストアンサー率19% (341/1726)
回答No.2

まあ、その通信プログラムのバグでしょう。たまたまXPでは症状が出なかったにすぎないかと。 VCのデバッガ上で通信プログラムを走らせるのが一番ですが、それが無理ならプログラムの各所でログを出力して、例外の発生個所を絞り込んでいくよりないでしょうね。

cpptext
質問者

補足

お世話になります。 ご返答有難うございます。 確かにエラーが見つかりました。 ClearCommError関数にて、16というエラー値を得ました。 その後すぐにGetLastError関数にて拡張エラーを確認したところ、0が帰ってきました。 XPでVC++を使ってデバッグしてもこのエラーは出てこないのですが、2000 profetional上でデバックするとでてきます。 どこをどのように直せばいいのでしょうか。 ご教示いただければ幸いです。

回答No.1

>何が問題なのでしょうか。 関数の呼び出しでエラーが起きNULLが返されているのに、そのNULLを判定せずにスルー(無視)し、オブジェクトのポインタか構造体のポインタがNULLになっているにも関わらず、そのオブジェクトか構造体のメンバに値を設定しようとした。 オブジェクトか構造体のポインタがNULLのままだと、オブジェクトか構造体のアドレスは「0x00000000」になり、メンバのアドレスは「0x00000000+構造体内でのメンバの位置」となる。 値を設定しようとしたメンバの「構造体内でのメンバの位置」が「0x38」であれば、そのメンバのアドレスは「0x00000000+0x38」になり「0x00000038」になる。 良くあるのが FILE *fp; fp = fopen("C:\\Program Files\\hogehoge.dat","r"); fread(bu,1,100,fp); //fopenがNULLを返すと、freadの先で0x00000000番地付近にアクセスして強制終了する などのように「絶対にオープン出来る筈だと思って、fopenがNULLを返した場合のエラー判定をしてない」と言うケース。 オープンしようとした場所が「システムフォルダ」などの場合「OSのバージョンが違うと、セキュリティ設定が異なり、別OSでオープン出来てたのが、こっちのOSではファイルが存在しててもオープン出来ない」と言う事があります。 その為「絶対にオープン出来る筈のファイルがオープンできない」なんて事も起こるので「fopenがNULLを返した場合のエラー判定をしてない」のが原因で「0x00000000番地付近のメモリにアクセスして終了」と言う事が良くあります。 ほぼ間違い無く「エラー時にNULLを返す関数を呼んだ時に、エラーでNULLが返って来ているのを判定し忘れている部分がある」と思います。

cpptext
質問者

お礼

お世話になります。 詳細なご説明、有難うございます。 頑張ってバグの修正に努めます。 有難うございました。

関連するQ&A