none
COM/ATL Windows7でCWindowImplを継承したウィンドウを作成できない RRS feed

  • 質問

  • VisualC++ 6.0 MFC、COM/ATL

    お世話になります。

    WindowsXPでは動作していた、COMコンポーネントなのですがWindows7で以下のコードでエラーが起きていることがわかりました。

    m_pTrigger = new CTrigger( this );

    if( m_pTrigger )

    {

    if(m_pTrigger->Create( 0, CWindow::rcDefault, "", WS_OVERLAPPEDWINDOW , WS_EX_TRANSPARENT ) )

    //処理

    m_pTrigger(CTrigger)はCWindowimplを継承しウィンドウメッセージ受信処理用に見えないウィンドウを生成しています。

    WindowsXPではCreate( )でウィンドウが生成されるのですが、Windows7で動作確認するとウィンドウが生成されません。

    原因は何が考えられるでしょうか? 引数など考えられる限りデフォルトに近くしても動作できず困っています。

    よろしくおねがいします。

    2011年4月14日 5:50

回答

  • このコードからは何一つ予測することができませんが。。。

    WM_CREATE ハンドラは用意していますか?用意している場合そこでエラーが発生していないかは確認しましたか?

    ATLはソースがついているので、CreateWindowExにたどり着くまでデバッグで潜っていくことができます。CreateWindowExにたどり着いていることは確認しましたか?

    とりあえずそのあたりをまずはチェックしてみてはいかがでしょうか?

     


    わんくま同盟,Microsoft MVP for Visual C++(Oct 2005-) http://blogs.wankuma.com/tocchann/
    • 回答としてマーク R-FW 2011年4月14日 7:45
    2011年4月14日 6:29

すべての返信

  • このコードからは何一つ予測することができませんが。。。

    WM_CREATE ハンドラは用意していますか?用意している場合そこでエラーが発生していないかは確認しましたか?

    ATLはソースがついているので、CreateWindowExにたどり着くまでデバッグで潜っていくことができます。CreateWindowExにたどり着いていることは確認しましたか?

    とりあえずそのあたりをまずはチェックしてみてはいかがでしょうか?

     


    わんくま同盟,Microsoft MVP for Visual C++(Oct 2005-) http://blogs.wankuma.com/tocchann/
    • 回答としてマーク R-FW 2011年4月14日 7:45
    2011年4月14日 6:29
  • ありがとうございます。

    Windows7はVC++6がインストールできず、デバッグに苦慮しているところです。

    VS2008等に移行すればいいのですが、仕事の都合上そうもいかず・・・。

     

    リモートデバッグなど駆使してなんとかやってみます。ありがとうございました。

    2011年4月14日 10:05
  • VS6を使わなくなって久しいのでVS6のリモートデバッガがどうなのか?についてはわかりませんが、一つあとのバージョンにあたるVS2002のリモートデバッガはWin7で使えます。

    また、デバッグだけなら、デバッグしたいモジュール、モジュールビルド時に一緒に生成されたPDB、ステップ実行するためのソースファイル(プロジェクトがある必要はない)があれば、VS2010などの最新環境でもデバッグできると思います。PDBのフォーマットそのものは古いものも読めたはずですし。。。

    やってみないとわからんですけどね。なにせ前世紀の代物なので。。。w

     


    わんくま同盟,Microsoft MVP for Visual C++(Oct 2005-) http://blogs.wankuma.com/tocchann/
    2011年4月14日 10:17
  • いろいろ調べたところ、Windous7 64Bit環境では

    WinAPI : CreateWindowEXまでたどり着いているのですが、GetLastErrorでエラー内容を確認しても何もエラーが出ない状況

    しかしウィンドウハンドルがCreateしても返ってきません。

     

    そこから調査を行ったところ

    VC++6でアプリを作成 VC6アプリからVC6のCOMを呼び出し、ウィンドウ生成したところ、Windows7でも問題なくウィンドウ生成されることがわかりました。

    VS2008(VB)からVC6のCOMを呼び出し、ウィンドウ生成するときにWindows7では何らかの影響でウィンドウ生成がうまくいかないようです。

    どうやらVC6のソースコードの問題ではなく、Windows7、64Bit環境でのCOMの呼び出し方に問題がありそうな気はするのですが、解決策が見つからない状況です。

    何か解決策や情報などお持ちの方がいればお願いします。


    2011年5月11日 6:47
  • >WM_CREATE ハンドラは用意していますか?用意している場合そこでエラーが発生していないかは確認しましたか?
    これ、重要ですよ。確認済みでしょうか?

    CreateWindow(Ex)はAPIから戻る前に、Window ProcedureにWM_CREATEなどのWindows Messageを送ります。
    この時、WM_NCCREATEやWM_CREATEでWindow ProcedureがFALSEを返すと、Errorが発生したと判断してWindowの生成を中止し、破棄します。
    結果、CreateWindow(Ex)でNULLが返ってきます。
    他にもNULLを返す条件がありますが、詳細はMSDNのCreateWindowを参照してください。

    2011年5月11日 11:17
  • VC6のATLってことなら、ATL ThunkがDEPに引っかかってる可能性があるのかも。
    jzkey
    2011年5月11日 12:45
  • DEPが引っかかっていました。

    Windows7においてDEPを強制的に無効にして (cmd.exe  >> bcdeidt /set nx AllwaysOff)

    試してみると、ウィンドウが生成されメッセージ処理ができるのを確認しました。

    突破口はみつかったので回避方法を考えてみます。

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

    2011年5月13日 6:12