none
他のアプリケーションを終了させたい RRS feed

  • 質問

  • Windows フォーム アプリケーションA.EXE、B.EXEで起動時に相手をチェックして起動している場合は相手を終了するようにUser32.dllのFindWindowとPostMessageを使っています。

    これらを64ビット環境で使うためにはコンパイルスイッチをx86にしてWOW環境化で動かしていますが、純粋な64ビットアプリケーションにするにはどうすれば良いのでしょうか?

    2011年6月25日 4:45

回答

  • Windows Forms アプリケーションということは、.NET (C#/VB/F#) なんかを利用されているということですよね?これらは、マネジド環境用の開発向けなので 64bit native の生成はできません…というのは置いといて、Windows on Windows を利用しないで実行するためには、ターゲットを AnyCPU か x64 にしてください。

    x64/ia64 では、64bit 版でも User32.dll という名前ですので、P/Invoke の宣言時に SafeHandle や IntPtr 等の適切な型が設定されていれば、そのまま動作するはずです。すでに確認されていて、動作しないために x86 にされているのであれば、ハンドル型を int で宣言しているなどのプログラミングミスが想定されるので、そのあたりの状況を含めて、もうすこし詳細な情報を開示されるとよいかと思います。

    2011年6月27日 3:27
  • いまどきの OS でプロセス間の PostMessage が失敗するという現象ですと、UIPI にパッと思い当たります。

    ユーザー インターフェイス特権の分離 (UIPI) - Windows 7 対応アプリケーションの互換性
    http://msdn.microsoft.com/ja-jp/windows/dd871146.aspx

    ただし、これは 64 ビットだから動かない、という話ではないですけれども。(まぁ、可能性として。)


    2011年6月28日 1:22

すべての返信

  • タイトルは「他のアプリケーションを終了させたい」ですが質問本文は「純粋な64ビットアプリケーションにするにはどうすれば良いでしょうか?」と全く別なことが書かれているように見受けられます。

    何を質問したいのか、ご自身で理解できていますか?

    2011年6月25日 5:06
  • Windows Forms アプリケーションということは、.NET (C#/VB/F#) なんかを利用されているということですよね?これらは、マネジド環境用の開発向けなので 64bit native の生成はできません…というのは置いといて、Windows on Windows を利用しないで実行するためには、ターゲットを AnyCPU か x64 にしてください。

    x64/ia64 では、64bit 版でも User32.dll という名前ですので、P/Invoke の宣言時に SafeHandle や IntPtr 等の適切な型が設定されていれば、そのまま動作するはずです。すでに確認されていて、動作しないために x86 にされているのであれば、ハンドル型を int で宣言しているなどのプログラミングミスが想定されるので、そのあたりの状況を含めて、もうすこし詳細な情報を開示されるとよいかと思います。

    2011年6月27日 3:27
  • K. Takaoka様

    お世話になります。

    >x64/ia64 では、64bit 版でも User32.dll という名前ですので、P/Invoke の宣言時に SafeHandle や IntPtr 等の適切な型が設定されていれば、そのまま動作するはずです。

    恥ずかしい話ですが、これは知りませんでした。

    「64bitでは動かいよ」と言われたのですが、あいにく検証できる環境が無いため余計な心配をしていたようです。

    気になっていたのは以下のコードです。

            [DllImport("User32.dll", CharSet = CharSet.Unicode)]
            static extern IntPtr FindWindow(string lpszClass, string lpszWindow);
            [DllImport("user32.dll", SetLastError = true)]
            static extern int PostMessage(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam);

                                                 ・

                IntPtr hWnd;
                string sClassName = null;

                string sWindowText = "foo";
                hWnd = FindWindow(sClassName, sWindowText);
                if (hWnd != IntPtr.Zero)
                {
                    PostMessage(hWnd, 0x10, new IntPtr(0), new IntPtr(0));
                }

    これはなにか問題があるでしょうか。

    応急的なテスト環境としてVirtualBoxのゲストOSに64ビット版Windows7をインストールし、AnyCPUでビルドしたものを試しましたが特に問題はないようです。なぜ先方で動かなかったのかは不明です。

     

    2011年6月28日 1:05
  • いまどきの OS でプロセス間の PostMessage が失敗するという現象ですと、UIPI にパッと思い当たります。

    ユーザー インターフェイス特権の分離 (UIPI) - Windows 7 対応アプリケーションの互換性
    http://msdn.microsoft.com/ja-jp/windows/dd871146.aspx

    ただし、これは 64 ビットだから動かない、という話ではないですけれども。(まぁ、可能性として。)


    2011年6月28日 1:22