none
Debug Modeでのエラーにつきまして RRS feed

  • 質問

  • いつもお世話になっております。

    Debug Modeでのエラーについて情報をいただきたくメールさせていただきました。

     

    Visual Stdioの2005を利用しているのですが、Debugモードで実行した際に

    以下のようなエラーが発生してしまっています。

     

    初回の例外が発生しました: 0xC0000008: An invalid handle was specified

     

    ただ、Debugモードでビルドしたコードであっても、バイナリーをVisual Stdio経由

    しないで単独で実行した場合には正しく動いているようです。

     

    もともとのコードが、他の人が開発したものであるのと、slnファイルがなく.dswファイル

    だったので古いVisual Stdioで開発されていたもののようです。

    (Visaul Stdio2005で開いて自動でslnファイルを作成しました。)

     

    Visual Stdio経由で実行しなければ実行されるものの、どのようなエラーかわからない為、

    修正しておきたいなと考えています。

     

    何か情報ありましたら教えていただけないでしょうか。

    よろしくお願いします。

    2008年5月11日 9:50

回答

  •  

    おそらくは、初期化していないHANDLE型変数を使用してAPIを呼び出している

    箇所があるのでしょう。有効なHANDLE値と偶然に一致する可能性は低いので

    ほとんどの場合にはエラーを無視していれば問題なく動作しているように見える

    ます。偶然に有効なHANDLE値と一致した場合には、データを破壊する恐れも

    あるので、当然修正しておく必要があります。

     

    デバッグ時に表示されるのに、通常実行時に表示されないのは、プロセスのデバッグ

    モードがことなるためです。SetErrorMode APIのパラメータを見ると理解が深まると思います。

    2008年5月12日 1:37
  •  urax さんからの引用

    AVICapSMに渡すハンドルとして、capCreateCaptureWindowで取得したデータは正しいのでしょうか?

    正しいと思います。

     

    AVICapSMに渡す前にブレークポイントを置いてm_hWndCに値が入っているか確認してみてください。

    恐らくcapCreateCaptureWindowが失敗してm_hWndCにNULLが入っているのではないかと思います。

     

    2008年5月12日 13:01

すべての返信

  •  

    おそらくは、初期化していないHANDLE型変数を使用してAPIを呼び出している

    箇所があるのでしょう。有効なHANDLE値と偶然に一致する可能性は低いので

    ほとんどの場合にはエラーを無視していれば問題なく動作しているように見える

    ます。偶然に有効なHANDLE値と一致した場合には、データを破壊する恐れも

    あるので、当然修正しておく必要があります。

     

    デバッグ時に表示されるのに、通常実行時に表示されないのは、プロセスのデバッグ

    モードがことなるためです。SetErrorMode APIのパラメータを見ると理解が深まると思います。

    2008年5月12日 1:37
  • 甕星さん

     

    ご回答ありがとうございます。

     

    以下のAVICapSMをWM_CAP_DRIVER_CONNECTを呼び出したときに、

    0xC0000008が発生していました。

     

    AVICapSM(m_hWndC, WM_CAP_DRIVER_CONNECT, (WPARAM)(i), 0L)

     

    An invalid handle was specifiedというエラーとのことですので、AVICapSMに渡しているm_hWndCが

    正しくないのだと思っているのですが、その前の部分で以下のように初期化されていました。

     

    m_hWndC = capCreateCaptureWindow("My Own Capture Window",
      WS_POPUP|(is_visible ? WS_VISIBLE : 0), 
      xx, yy, w, h, (HWND)hWnd, 0);

     

    AVICapSMに渡すハンドルとして、capCreateCaptureWindowで取得したデータは正しいのでしょうか?

     

    もし情報ありましたら、教えていただけると助かります。
    2008年5月12日 7:56
  •  urax さんからの引用

    AVICapSMに渡すハンドルとして、capCreateCaptureWindowで取得したデータは正しいのでしょうか?

    正しいと思います。

     

    AVICapSMに渡す前にブレークポイントを置いてm_hWndCに値が入っているか確認してみてください。

    恐らくcapCreateCaptureWindowが失敗してm_hWndCにNULLが入っているのではないかと思います。

     

    2008年5月12日 13:01
  •  

    C.Johnさん

    ご回答ありがとうございます。

     

    実は、コード内にてm_hWndCのNULLチェックをしています。

    デバッガーにて、m_hWndCの値を見てみたのですが、0x002f124eという値が入っていました。

     

    自分で調べていて気付いたのですが、capCreateCaptureWindowに渡す第6引数のHWND hWnd, がNULLになってしました。

     

    APIを見るとhWnd(親ウィンドウのハンドルを指定します。 )となっているので、もしかしたらこれかなと考えています。

     

    情報ありがとうございます。

    自分でも、もう少し追ってみようと思います。

    ありがとうございました。

    2008年5月12日 13:16
  • こんにちは、森田です。
    uraxさん、フォーラムのご利用ありがとうございます。

     

    ちょっと私も調べてみたんですが、現状のcapCreateCaptureWindowは
    第二引数でWS_POPUPが指定されているため、親ウィンドウのハンドル指定を
    省略しても処理が進んでいるのだと思います。


    親ウィンドウのハンドルを指定するのであれば、WS_POPUP指定をやめて、
    親ウィンドウのクライアント領域にキャプチャウィンドウを表示するように
    して試してみるのもいいかもしれません。

     

    ただ、これで現象の回避ができるかはわからないところです。ごめんなさい!


    uraxさんの方で、すでに原因もしくは回避方法が判明してるということでしたら、
    その情報を投稿していただけると嬉しいです!


    回答を寄せてくださった皆さんありがとうございました!
    有用だと思う情報に勝手ながら回答済みチェックを付けさせていただきました。

     

     

    この投稿は現状のまま何の保証もなく掲載しているものであり、
    何らかの権利を許諾するものでもありません。
    コミュニティにおけるマイクロソフト社員による発言やコメントは、マイクロソフトの正式な見解またはコメントではありません。
    詳しくは
    http://www.microsoft.com/japan/communities/msp.mspx をご覧ください。 

    2008年6月5日 9:38