none
アウトプロセスによる画面(機能)提供方法について RRS feed

  • 質問

  • イメージ的には、Wordの中にExcelのシートが表示されるようなことを実現したいと考えており、方式を模索しているところです。

    アプリケーションが2つ(app1.exe、app2.exe)あり、1つ目のアプリケーション(app1.exe)のウインドウ内に、2つ目のアプリケーション(app2.exe)のコントロールを表示したいと思っています。

    Wordの中にExcelシートを表示する場合や、InternetExplorerの中にPDFやExcelを表示するイメージです。

    2つ目のアプリケーション(app2.exe)内のコントロールをOCXにすることで、実現(app1.exe、app2.exeで共通のOCXを利用)することは可能と思いますが、今回はEXEとして実現する方法を模索しています。

    app2.exeをActiveX EXEにして実現するのかと思いましたが、app2.exe内のコントロールをどのようにして、app1.exeに表示させたらよいか分からず、行き詰りました。

    どのような方式で実現できるのか、あるいは、参考文献をご存知の方は教えてください。

    ざっくりとした書き方ですいませんが、よろしくお願いします。

    2013年11月16日 10:13

回答

  • プログラムの作成については、仲澤さんが書いてるので省略します。

    今現在おそらく一番まとまった日本語情報だと思うので、MFCのOLE関連のトップを張っておきます。また、これと合わせて、MFC COM などにも目を通しておくとよいかもしれません。

    サンプルコードは、2012からVS添付ではなく、Web上での公開となりました(2010までは、パッケージに含まれていてインストール対象となっている)。

    MSDNライブラリの開発ツールのトップページにコードサンプルのリンクがありますのでそこからたどってください。

    また、オートメーションで実現するという方向であれば、MFCのほかにATLという選択肢もあります(サーバーサイドもクライアントサイドも)。MFCアプリに機能追加することもできますのでそれも検討材料にするとよいでしょう。

    リンクは、Web上の掲示板なのですべてWebサイトを参照していますが、MSDNライブラリをローカルにインストールしている場合は同じもの(か場合によっては古いもの)が、自身のPC内にありますので、そちらを参照してもよいと思います。


    とっちゃん@わんくま同盟, Microsoft MVP for Visual C++ (Oct 2005-) http://blogs.wankuma.com/tocchann/

    • 回答の候補に設定 星 睦美 2013年11月20日 1:10
    • 回答としてマーク ころわん 2013年11月20日 10:48
    2013年11月19日 2:06
  • 先の自分の発言にあるように、新規プロジェクトを作成します。
    シングルドキュメントでよいでしょう。VS2008しかないのでそれで説明します。

    1.ウィザードで、「複合ドキュメントサポート」で「フルサーバー」を選びます。
     適当なファイル拡張子を指定しましょう。
    2.サーバーアイテム***SrvrItem::public COleServerItemが作成されるので、
     ***SrvrItem::OnDraw(・・・)の下の方で円や×などを描画します。
     生成されたコードでは、ウインドウエクステントがX,Yとも3000になっているので注意してください。
    3.コンパイルリンクしたら、一度実行し、ファイルを保管します。
    4.Excelを立ち上げて「挿入」「オブジェクト」「ファイルから」タブの
     「参照...」ボタンをクリック、先の保管したファイルを選択しOKします。
    5.***SrvrItem::OnDraw()が実行されます。

    本当はもっと色々やることがあるのですが大部なのでとても説明しきれません。
    コンテナの方も同様の方法で作成することができますが、とりあえずExcelで実験しましょう。
    この程度のキーワードを辿って、自ら検索して構築できる程度でないと、
    完遂するのは困難であると考えられます。
    コードもデバッグも結構大変なので覚悟してかかりましょう。がんばってください。

    2013年11月19日 1:29

すべての返信

  • 実現したい機能は、OLE(Object Linking and Embedding)の事ですかね?ActiveX Documents は、OLEのインプレース編集機能を持つサーバーに、IEでのインプレース編集を搭載したものを指します。

    もし、App1とApp2だけでやり取りができればいい(ほかのアプリとはやり取りできる必要はない)のなら、OLEクライアントとOLEサーバーとするのではなく、オートメーションで実現したほうがブロックの仕組みを盛り込まずに済むので、ローコストかもしれ前sン。

    もしくは、その他のプロセス間通信(方法がいろいろあるので紹介しきれない)を使うか。。。


    とっちゃん@わんくま同盟, Microsoft MVP for Visual C++ (Oct 2005-) http://blogs.wankuma.com/tocchann/

    2013年11月18日 8:26
  • とっちゃんさんの発言通りOLEで実装可能ですが
    (複合ドキュメントのコンテナとフルサーバー)。

    単純に、
    app2.exeの、当該コントロール部分をDLLに切り出して
    app1.exeから利用する。

    という一番安易な方法はだめでしょうか。

    2013年11月18日 9:58
  • とっちゃんさん、仲澤@失業者さん、ありがとうございます。

    OLEでの実現方法と、オートメーションでの実現方法は、知識不足のためコーディングイメージが、すぐに思いつかないため、引き続き、色々調べてみます。

    もし、サンプル作成の参考となる手順が公開されているようなサイトをご存知でしたら、教えて頂けると助かります。

    VisualStudioでMFCアプリケーションのウイザードを利用して、app1.exe、app2.exeのサンプルを簡単に作成できるとうれしいのですが。

    ※今回は、コントロール部分をDLLに切り出す方法は、諸事情によりできないため、exe同士での実現方法を模索しています。

    • 編集済み ころわん 2013年11月18日 14:24 文章の改行を修正しました。
    2013年11月18日 14:21
  • 先の自分の発言にあるように、新規プロジェクトを作成します。
    シングルドキュメントでよいでしょう。VS2008しかないのでそれで説明します。

    1.ウィザードで、「複合ドキュメントサポート」で「フルサーバー」を選びます。
     適当なファイル拡張子を指定しましょう。
    2.サーバーアイテム***SrvrItem::public COleServerItemが作成されるので、
     ***SrvrItem::OnDraw(・・・)の下の方で円や×などを描画します。
     生成されたコードでは、ウインドウエクステントがX,Yとも3000になっているので注意してください。
    3.コンパイルリンクしたら、一度実行し、ファイルを保管します。
    4.Excelを立ち上げて「挿入」「オブジェクト」「ファイルから」タブの
     「参照...」ボタンをクリック、先の保管したファイルを選択しOKします。
    5.***SrvrItem::OnDraw()が実行されます。

    本当はもっと色々やることがあるのですが大部なのでとても説明しきれません。
    コンテナの方も同様の方法で作成することができますが、とりあえずExcelで実験しましょう。
    この程度のキーワードを辿って、自ら検索して構築できる程度でないと、
    完遂するのは困難であると考えられます。
    コードもデバッグも結構大変なので覚悟してかかりましょう。がんばってください。

    2013年11月19日 1:29
  • プログラムの作成については、仲澤さんが書いてるので省略します。

    今現在おそらく一番まとまった日本語情報だと思うので、MFCのOLE関連のトップを張っておきます。また、これと合わせて、MFC COM などにも目を通しておくとよいかもしれません。

    サンプルコードは、2012からVS添付ではなく、Web上での公開となりました(2010までは、パッケージに含まれていてインストール対象となっている)。

    MSDNライブラリの開発ツールのトップページにコードサンプルのリンクがありますのでそこからたどってください。

    また、オートメーションで実現するという方向であれば、MFCのほかにATLという選択肢もあります(サーバーサイドもクライアントサイドも)。MFCアプリに機能追加することもできますのでそれも検討材料にするとよいでしょう。

    リンクは、Web上の掲示板なのですべてWebサイトを参照していますが、MSDNライブラリをローカルにインストールしている場合は同じもの(か場合によっては古いもの)が、自身のPC内にありますので、そちらを参照してもよいと思います。


    とっちゃん@わんくま同盟, Microsoft MVP for Visual C++ (Oct 2005-) http://blogs.wankuma.com/tocchann/

    • 回答の候補に設定 星 睦美 2013年11月20日 1:10
    • 回答としてマーク ころわん 2013年11月20日 10:48
    2013年11月19日 2:06
  • 仲澤さん、とっちゃんさん、ありがとうございます。

    教えて頂いた情報を元に、サンプルを作成しながら、いろいろ調べてみます。

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

    2013年11月19日 13:15
  • フォーラム オペレーターの星 睦美です。
    仲澤@失業者 さん、とっちゃん さん いつも回答ありがとうございます。

    ころわん さん、こんにちは

    今回はフォーラムの回答者のアドバイスが参考になったようですね。
    今後もユーザー同士の情報交換の場としてフォーラムが活発になりますように、フォーラムの回答が参考になりましたら投稿者から[回答としてマーク] をお願いしています。(お忘れのような場合には、私からマークさせていただきますね。)

    それではこれからもMSDN フォーラムをお役立てください。


    フォーラム オペレーター 星 睦美 - MSDN Community Support

    2013年11月20日 1:19