kkamegawa's weblog

Visual Studio,TFS,ALM,VSTS,DevOps関係のことについていろいろと書いていきます。Google Analyticsで解析を行っています

忘れられたAPI:DDE編

コメントもらえてうれしかったので、気をよくして本日はDDE。実は私、DDE使ったことありません(笑)。Windowsが出た当時、プロセス間をまたいだ、ある程度大きなデータ共有*1はこれとWM_COPYDATAメッセージくらいしかなかったと思います。
「いつか使うことはあるかもね」ということで、技術者のたしなみとしてどんなことができるかくらいは知っている程度です。それでもMCIよりも間違い度高いことは間違いないので、コメントよろしく(^^;。

いつできたの?

Windows 3.0から使えたことは間違いないのですが、2.0とかでも使えたかもしれません。すいません、この辺はまだWindowsプログラムやっていなかったので覚えていません。なお、Visual BASICでは最後の16bit版専用で、傑作と名高い(日本語版は販売されなかった)3.0からサポートされたんだそうです。
ちなみにDDEがもうちょっと発展してOLEができたんじゃなかったでしたっけ?

どんな機能があるの?

信頼に乗っ取った、一台のマシン内におけるサーバ/クライアント型のデータ共有機能を提供します。リンク方法には二種類あって、データ提供側でデータが更新されたら、クライアントにも即時更新するwarm data link、クライアントからの要求があったタイミングで更新するhot data linkです。
余談ですが、Windows NT 3.1ではネットワークDDEといってネットワーク越しにDDEを実行する機能もサポートされました。こちらはDDE以上に使われていないんじゃないでしょうか。NTからネットワーク周りが格段に安定したので、socket使ったり、自前でやったりとか。
また、Windows 3.1/NT3.51までの標準シェルであったProgram Managerへのアプリケーション登録もDDEだったので、セットアップを作る人には必須の技術でした*2。progman.exeという名前で自前のウィンドウクラスを作っているのですが、互換性の問題からWindowx XPですらもいまだに残っています。SPY++でウィンドウを列挙すると"Program Manager"というウィンドウがあるはずです。
やったことはないですが、16bitから32bitのプログラムをDDEで呼ぶこともできたはずなので、両方のバイナリを使う場合にデータの共有としても使っていた人がいるかと思います。

どうやって使うの?

Win32ではuser32.dllでサポートしているので、ヘッダファイルだけddeml.h/dde.hを追加します。Win16では確かDDEは別ライブラリだったと記憶しています(でしたよね?)。最初はDDEメッセージのみだったのが、いつの間にかDDEMLというAPI群が追加されました。
また、デバッグ用に"DDE SPY"というDDEメッセージを監視するプログラムがSDK(今のPlathome SDK)についていました。
DDEML:http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpipc/html/Toppage_DDEManagementLib.asp
DDE:http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpipc/html/Toppage_DDEManagementLib.asp
Network DDE:http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpipc/html/Toppage_DDEManagementLib.asp

みんな使っていたの?

少なくともWindows 3.1時代が全盛期(おおげさ)で、割と使われていたように記憶しています。昔で言うところのオンラインソフトでもDDEのインタフェースを公開していたものはいくつもありました。
Windows 95のexplorerになってもDDEを使ってプログラムを登録するアプリケーションをしばしば見かけたことがあります。

今も使える?

使えるはずです…最初に書いたように私は使う必然性がなかったので、結局プログラムも保有していません。
また、.NETになってからDDEがサポートされなくなったため、Visual BASIC .NETへのアップグレードはできないそうです。このようなプログラムはVB6のままでいてくれとMicrosoftがMSDN Libraryで書いています。
http://www.microsoft.com/japan/msdn/net/upgrade/actxvnetcontrols.asp

なぜ使われなくなったの?

上のURLでも書かれているように、通信を行う手段は他にいくらでもあるので、今やほとんど意味がなくなりました。すなおにsocketとか名前付パイプとか、共有メモリとか使う方が建設的でしょう。

*1:しかもWin16であるということを前提にしない安全な方法

*2:とはいっても、特定のメッセージとプログラム情報送るだけだったので、たいしたことありませんでしたが