- PR -

OLEはDDEを使用していない?

投稿者投稿内容
Take-C
常連さん
会議室デビュー日: 2002/05/09
投稿数: 23
投稿日時: 2008-02-07 10:02
現在OLEを使ってExcel上の項目を更新する方法を探っています。
独自に開発したアプリケーション(MyApp.exe)をOLEサーバとし、ExcelをOLEクライアントとしています。

試行錯誤の末、Excel上のセルに
コード:
=MyApp.document.1|'C:\\test.dat'!'!data'


という式を入力してMyApp.exeと接続し、値の自動更新をすることができるようになりました。

ここでふと疑問に思ったのですが、この書式はDDE接続をするときと同じことに気がつきました。

OLEで接続しているということは自動的にDDEを使用しているということになるのでしょうか?

DDEスパイを使った限りでは何のログも表示されていないため、DDEでの通信は発生していないように見受けられます。
(DDEを使用しているアプリケーションのログはきちんと表示されるため、DDEスパイの設定には問題がないと思います。)

Microsoftの解説(以下のリンク)では「DDE (Dynamic Data Exchange) は古いテクノロジであるため安全とは言えません。できる限り、OLE (Object Linking and Embedding) のような、DDE より安全な方法を使用してください。」と書いてあるため、できる限りDDEは使用したくありません。

http://office.microsoft.com/ja-jp/excel/HP030662101041.aspx

「OLEはDDEを使っていない!」と言い切ってもよいのでしょうか?
また、このことが詳しく書かれているサイトをどなたかご存じないでしょうか?

よろしくお願いいたします。
Tdnr_Sym
ぬし
会議室デビュー日: 2005/09/13
投稿数: 464
お住まい・勤務地: 明石・神戸
投稿日時: 2008-02-07 11:50
こんにちは。

引用:

Take-Cさんの書き込み (2008-02-07 10:02) より:
独自に開発したアプリケーション(MyApp.exe)をOLEサーバとし、ExcelをOLEクライアントとしています。

試行錯誤の末、Excel上のセルに
コード:
=MyApp.document.1|'C:\\test.dat'!'!data'


という式を入力してMyApp.exeと接続し、値の自動更新をすることができるようになりました。



Excelでそんなことができるんですねぇ。
初めて知りました。(DDEリンクできることは知ってました。)
まあ元々個人的にExcelは好きじゃないので使い方なんて殆ど知りませんが。

引用:

OLEで接続しているということは自動的にDDEを使用しているということになるのでしょうか?



それはないです。

引用:

「OLEはDDEを使っていない!」と言い切ってもよいのでしょうか?



言い切れないです。かなり昔のOLE1.0の頃は通信手段としてDDEメッセージ(WM_DDE_EXECUTE)を使用していました。

(参考):Object Linking and Embedding(wikipedia english)

[追記]
(参考):OLE Concepts and Requirements Overview (Microsoft OLE 1.0)


[ メッセージ編集済み 編集者: Tdnr_Sym 編集日時 2008-02-07 12:21 ]
とっちゃん
大ベテラン
会議室デビュー日: 2005/07/19
投稿数: 203
投稿日時: 2008-02-07 12:53
プロセス間通信としてのOLEのプロトコルは何か?という話ですかね。

OLE1.0の時代は、DDE(Dynamic Data Exchange)をベースアーキテクチャとしていました。
OLE2.0(現在)では、COM(Component Object Model)をベースアーキテクチャとしています。
そのCOMは、プロセス間通信に RPC(Remote Procedure Call)を利用しています。

というところでよろしいかしら?

で、MyAppという自前のアプリは、OLEサーバーですか?
#Automationではなく、Object Linking and Embedding の
であれば、EXCEL側にIOleServerItemをどうやって送りつけるか?ということになるかと。

通常は、ユーザーがエクセル上にドロップしたり
クリップボードを経由して貼り付けるということをすると思うのですが。
VBAあるいは、Automation でExcel側にドロップするという方法もあるような気がします。
#気がするだけですけどね

ちなみにコード部分ですが、OLEのLink貼り付けの表記と思われます。

実際に、OLEプロトコルで呼び出していると思いますが、サーバー側の作りがわからないので何とも言えないですね。

_________________
// とっちゃん(高萩 俊行)@わんくま同盟
// とっちゃん’Blog
// MS-MVP for Developer Tools - Visual C++
// WindowsInstallerの話題はhttp://www.freeml.com/msiまで
Take-C
常連さん
会議室デビュー日: 2002/05/09
投稿数: 23
投稿日時: 2008-02-07 15:36
Tdnr_Symさん、ご回答ありがとうございます。
引用:

Tdnr_Symさんの書き込み (2008-02-07 11:50) より:

引用:

「OLEはDDEを使っていない!」と言い切ってもよいのでしょうか?



言い切れないです。かなり昔のOLE1.0の頃は通信手段としてDDEメッセージ(WM_DDE_EXECUTE)を使用していました。

(参考):Object Linking and Embedding(wikipedia english)

[追記]
(参考):OLE Concepts and Requirements Overview (Microsoft OLE 1.0)



参考になるURLですね。
現在の環境はWindows XP + Excel 2000なので、OLE 2.0を使用していると思います。
ということはDDEではなさそうです。

ありがとうございました。
Take-C
常連さん
会議室デビュー日: 2002/05/09
投稿数: 23
投稿日時: 2008-02-07 16:14
とっちゃんさん、ご回答ありがとうございます。
引用:

とっちゃんさんの書き込み (2008-02-07 12:53) より:
プロセス間通信としてのOLEのプロトコルは何か?という話ですかね。

OLE1.0の時代は、DDE(Dynamic Data Exchange)をベースアーキテクチャとしていました。
OLE2.0(現在)では、COM(Component Object Model)をベースアーキテクチャとしています。
そのCOMは、プロセス間通信に RPC(Remote Procedure Call)を利用しています。

というところでよろしいかしら?



詳しい説明ありがとうございます。
DDEを使ってるわけではないということがわかりました。
引用:

で、MyAppという自前のアプリは、OLEサーバーですか?
#Automationではなく、Object Linking and Embedding の
であれば、EXCEL側にIOleServerItemをどうやって送りつけるか?ということになるかと。


Object Linking and EmbeddingのOLEサーバーです。
引用:


通常は、ユーザーがエクセル上にドロップしたり
クリップボードを経由して貼り付けるということをすると思うのですが。
VBAあるいは、Automation でExcel側にドロップするという方法もあるような気がします。
#気がするだけですけどね

ちなみにコード部分ですが、OLEのLink貼り付けの表記と思われます。

実際に、OLEプロトコルで呼び出していると思いますが、サーバー側の作りがわからないので何とも言えないですね。



自作したOLEサーバのソースをそのまま載せるとかなり大変なことになるので、別の例で説明します。

<やりたいこと>
Wordで編集した文章をExcelのセル内の数式で指定して表示させる。OLEオブジェクトによるリンク貼り付けは行わない。

この場合、WordがOLEサーバでExcelがOLEコンテナになります。

<手順>

  1. WordでC:\\test.docというドキュメントを作成する。
  2. test.docの任意の場所を選択し、[挿入(I)]-[ブックマーク(K)]を選択する。
  3. ブックマーク名に「myitem」と入力して[追加(A)]を押す。
  4. Excelを開く。
  5. 任意のセルを選択し、「=Word.Document|'C:\\test.doc'!'!myitem'」と入力する。

こうすることでtest.docで指定したブックマーク内の文章を変更するとExcelにも自動的にその値が反映されます。
このときのWordと同じ様な役割をするOLEサーバーの作成にはある程度メドがついたのですが、そもそもこれは本当にOLEであってDDEではないのか?という疑問がわいたので今回の質問に至りました。
Excelのヘルプの「作業中のコンピュータにないアプリケーションのデータとのリンクを設定する数式について」という項目を読む限りではセルに書いた書式はDDEを使っているかのように記述されています。
DDEスパイのログを見た限りではDDEは使用していないようですが。
ちなみに、自作したOLEサーバーアプリケーションはMFCのCOleServerDocとCOleServerItemを使用してますが、DDEは意識していないつもりです。
Visual Studioのウィザードが勝手にDDEを使ってたらわかりませんが
とっちゃん
大ベテラン
会議室デビュー日: 2005/07/19
投稿数: 203
投稿日時: 2008-02-07 17:41
引用:

Take-Cさんの書き込み (2008-02-07 16:14) より:


自作したOLEサーバのソースをそのまま載せるとかなり大変なことになるので、別の例で説明します。

<やりたいこと>
Wordで編集した文章をExcelのセル内の数式で指定して表示させる。OLEオブジェクトによるリンク貼り付けは行わない。

この場合、WordがOLEサーバでExcelがOLEコンテナになります。

<手順>

  1. WordでC:\\\\test.docというドキュメントを作成する。
  2. test.docの任意の場所を選択し、[挿入(I)]-[ブックマーク(K)]を選択する。
  3. ブックマーク名に「myitem」と入力して[追加(A)]を押す。
  4. Excelを開く。
  5. 任意のセルを選択し、「=Word.Document|'C:\\\\test.doc'!'!myitem'」と入力する。

こうすることでtest.docで指定したブックマーク内の文章を変更するとExcelにも自動的にその値が反映されます。
このときのWordと同じ様な役割をするOLEサーバーの作成にはある程度メドがついたのですが、そもそもこれは本当にOLEであってDDEではないのか?という疑問がわいたので今回の質問に至りました。
Excelのヘルプの「作業中のコンピュータにないアプリケーションのデータとのリンクを設定する数式について」という項目を読む限りではセルに書いた書式はDDEを使っているかのように記述されています。
DDEスパイのログを見た限りではDDEは使用していないようですが。



この形で張り付いたものは、リンクオブジェクトです。
やりたいことでリンクではなく!という部分が実現できていないことになります。

具体的にどのように異なるのかは、
オブジェクトの貼り付けを、クリップボード経由で行うとわかりますが

手元のExcel2007だと、数式のエディットには、
=EMBED("Word.Document.12","")
と表示されていました。

ちなみに同じものをリンクで張った場合は、
=Word.Document.12|'C:\\\\Test.docx'!'!OLE_LINK1'
となっていました。
#C:\\\\Test.docx ファイルの場合

引用:

ちなみに、自作したOLEサーバーアプリケーションはMFCのCOleServerDocとCOleServerItemを使用してますが、DDEは意識していないつもりです。
Visual Studioのウィザードが勝手にDDEを使ってたらわかりませんが


COleServerDoc のヘルプに出てますけど、リンク貼り付けもサポートしていますよ。

_________________
// とっちゃん(高萩 俊行)@わんくま同盟
// とっちゃん’Blog
// MS-MVP for Developer Tools - Visual C++
// WindowsInstallerの話題はhttp://www.freeml.com/msiまで
Take-C
常連さん
会議室デビュー日: 2002/05/09
投稿数: 23
投稿日時: 2008-02-07 20:06
引用:

とっちゃんさんの書き込み (2008-02-07 17:41) より:
この形で張り付いたものは、リンクオブジェクトです。
やりたいことでリンクではなく!という部分が実現できていないことになります。


説明がまずかったようですね。
私が「OLEオブジェクトによるリンク貼り付けは行わない。」と書いたのは「ユーザに明示的にコピー&ペーストによるリンクを行わせない」という意味です。
「OLEオブジェクトによる・・・」というくだりが曖昧で誤解を生んだようです。

ユーザにはセル内に直接数式を記述してもらうことを想定しています。
引用:

具体的にどのように異なるのかは、
オブジェクトの貼り付けを、クリップボード経由で行うとわかりますが

手元のExcel2007だと、数式のエディットには、
=EMBED("Word.Document.12","")
と表示されていました。

ちなみに同じものをリンクで張った場合は、
=Word.Document.12|'C:\\Test.docx'!'!OLE_LINK1'
となっていました。
#C:\\Test.docx ファイルの場合


この貼り付けはWordでクリップボードにコピーし、Excelメニューの[編集(E)]-[形式を選択して貼り付け(S)]で「貼り付ける形式」に[Microsoft Word 文書オブジェクト]を選択したときのものでしょうか?
私が想定しているのは「貼り付ける形式」に[テキスト]を選択した場合と同様のものです。実際にはユーザはコピー&ペーストは行わないためクリップボードは使用しませんが。
引用:

引用:

ちなみに、自作したOLEサーバーアプリケーションはMFCのCOleServerDocとCOleServerItemを使用してますが、DDEは意識していないつもりです。
Visual Studioのウィザードが勝手にDDEを使ってたらわかりませんが


COleServerDoc のヘルプに出てますけど、リンク貼り付けもサポートしていますよ。


そうですね。私もその辺のヘルプをいろいろ探って最初のOLEサーバーを作成しました。その結果、

  • コピー&ペーストをしないで、
  • OLEサーバの変更内容をExcelのセルに反映させる(リモート参照数式(=Word.Document|〜)を利用)

というところまでなんとかたどり着きました。
で、ここで記述したリモート参照数式がDDEの書式と同じであったため、最初の質問の「OLEはDDEを使用しているのか?」というふとした疑問が出てきました。
とっちゃん
大ベテラン
会議室デビュー日: 2005/07/19
投稿数: 203
投稿日時: 2008-02-08 14:55
引用:

Take-Cさんの書き込み (2008-02-07 20:06) より:

説明がまずかったようですね。
私が「OLEオブジェクトによるリンク貼り付けは行わない。」と書いたのは「ユーザに明示的にコピー&ペーストによるリンクを行わせない」という意味です。
「OLEオブジェクトによる・・・」というくだりが曖昧で誤解を生んだようです。

ユーザにはセル内に直接数式を記述してもらうことを想定しています。


なるほど。OLE Linking の リンクではなくて、ユーザーにペースト動作をさせない...ということだったんですね。

引用:

そうですね。私もその辺のヘルプをいろいろ探って最初のOLEサーバーを作成しました。その結果、

  • コピー&ペーストをしないで、
  • OLEサーバの変更内容をExcelのセルに反映させる(リモート参照数式(=Word.Document|〜)を利用)

というところまでなんとかたどり着きました。
で、ここで記述したリモート参照数式がDDEの書式と同じであったため、最初の質問の「OLEはDDEを使用しているのか?」というふとした疑問が出てきました。



リンクフォーマットが同じに「見える」るのは、単にExcelがそうしているからだと思います。
実際にリモート参照数式にあるデータは、バイナリデータでプレゼンイメージも含んでいます。
表示形式に、古き時代からあるDDEと同じものを選んだのは、単にエクセルチームが内部的な違いを隠ぺいできているからだと思います。

うーん...なんとなく、歯切れが悪い気がするんですが、もしかして問題の本質は違うところにあったりしませんか?
#SetItemNameとか調べてみるとちょっとは良いかも...

多分ご存じとは思いますが、OLEサーバーのサンプルに HIERSVR というのがあります。もし見たことがないのであれば参考になると思うので調査してみることをお勧めします。

_________________
// とっちゃん(高萩 俊行)@わんくま同盟
// とっちゃん’Blog
// MS-MVP for Developer Tools - Visual C++
// WindowsInstallerの話題はhttp://www.freeml.com/msiまで

スキルアップ/キャリアアップ(JOB@IT)