株式会社エス・スリー・フォー

6.4 DDE の例

次の例はさらに複雑なもので、Windows DDE 機能を介して、RWDDEstreambuf クラスを使い、RWBinaryTree を交換する方法を示します。Windows クリップボードの場合にも、同様なテクニックを使用することができます。

#include <rw/bintree.h>
#include <rw/collstr.h>
#include <rw/bstream.h>
#include <rw/winstrea.h>
#include <windows.h>
#include <dde.h>

BOOL
PostCollection(HWND hwndServer, WORD cFormat){
   RWBinaryTree sc;                                          // 1
   sc.insert(new RWCollectableString("Mary"));
   sc.insert(new RWCollectableString("Bill"));
   sc.insert(new RWCollectableString("Pierre"));

   // RWDDEstreambuf を割り当て、それを使って初期化する
   // RWbostream:
   RWDDEstreambuf* sbuf = new RWDDEstreambuf(cFormat,        // 2
                                             FALSE,          // 3
                                             TRUE,           // 4
                                             TRUE);          // 5
   RWbostream bostr( sbuf );                                 // 6

   // コレクションを Rwbostream に格納する:
   bostr << sc;                                              // 7

   // 出力ストリームをロックし、そのハンドルを取得する:
   HANDLE hDDEData = sbuf->str();                            // 8

   // DDE メッセージを同定するアトムを取得する:
   ATOM atom = GlobalAddAtom("SortedNames");                 // 9

   // DDE の応答をポストする:
   return PostMessage(0xFFFF, WM_DDE_DATA, hwndServer,       //10
                      MAKELONG(hDDEData, atom));
}

のコードでは、大きなメモリモデルが前提とされています。次に、コードの説明を行ごとに示します。

//1
RWBinaryTree が構築され、それに項目が挿入されます。
//2-//5
RWDDEstreambuf が割り当てられます。コンストラクタはいくつかの引数をとります。最初の引数は Windows クリップボードの形式です。この例では、形式の種類が引数として渡されていますが、一般には Windows に形式を登録し (RegisterClipboardFormat() を使う)、それを使用します。
その他の引数は、DDE データ交換およびメモリ管理に関連しています。引数の一覧に関しては『Tools.h++ Class Reference』を参照してください。それらの意味については、『Programming Windows 3.0』、または 『Microsoft Windows Guide to Programming』を参照してください。
//6
RWbostream が与えられた RWDDEstreambuf から生成されます。ここで RWpostream を使うこともできますが、DDE 交換は同じマシンアーキテクチャ内で行われるので、余分な手間のかかる移植可能な ASCII 形式を使っても意味がありません。また、streambuf の型によって設定されるバイトの状態が、どのように Rwvostream の型によって設定される形式から切り離されるかに注意してください。
//7
コレクションは Rwbostream に保存されます。RWbostreamと関連付けられている streambuf は実際には RWDDEstreambuf であるため、コレクションは GMEM_DDESHARE 属性を持つ Windows のグローバルメモリ割り当て領域に保存されます。この割り当て領域は、オーバーフローすると自動的にサイズ変更されます。その他の strstreambuf と同様、メンバ関数 setbuf() を使って割り当て領域の大きさを変更できます。
//8
RWDDEstreambuf がロックされます。いったん str() を使ってロックしたら、他の strstreambuf と同様、この streambuf を再び使用することはできません。ただし、RWDDEstreambuf::str() は char* ではなく、ハンドルを返すことに注意してください。このハンドルは、返す前にロック解除されます。
//9
この DDE データを同定するためにアトムを生成します。
//10
RWDDEstreambuf::str() によって返されたハンドルが、アトムを同定するとともにポストされます。

クリップボードを介したデータのやり取りには、より簡単な同様の方法を使用できます。

特殊化された streambufRWCLIPstreambufRWDDEstreambuf は、Rogue Wave 仮想ストリーム機能と共に使わなければならないものではありません。それらは通常の istream および ostream と共に、きわめて簡単に使用することができます。ただし、実行時に形式を設定することができません。