バナーをクリックすれば目次に戻ります
Copyright 1999 Rogue Wave Software
Copyright 1999 Sun Microsystems, Inc.
RWDDEstreambuf
RWDDEstreambuf RWCLIPstreambuf
streambuf
#include <rw/winstrea.h> #include <iostream.h> iostream str( new RWDDEstreambuf(CF_TEXT, TRUE, TRUE, TRUE) ) ;
このクラスには、動的と静的の 2 つの動作モードがあります。動的モードでは、必要に応じてメモリーの割り当てと再割り当てが行われます。内部バッファーの現在のサイズに比べて挿入する文字数が多すぎる場合、バッファーのサイズが変更され、必要に応じて古い文字が新しいメモリーにコピーされます。これはユーザーには見えません。このモードは、主に DDE サーバが使用するためのものです。静的モードでは、バッファー streambuf は特定のメモリー領域から作成されます。再割り当ては行われません。このモードは、主に DDE クライアントが使用するためのものです。
動的モードでは、RWDDEstreambuf は、メンバー関数 str() が呼び出されるまで、割り当てられたメモリーを「所有」します。str() はバッファーを「フリーズ」し、ロック解除された Windows ハンドルを RWDDEstreambuf に返します。それ以上挿入した場合の影響は定義されていません。str() が呼び出されるまでは、割り当てられたメモリーを解放するのは RWDDEstreambuf デストラクタの責任です。str() が呼び出された後は、ユーザーの責任になります。
静的モードでは、メモリーハンドルを解放するのはユーザーの責任です。ただし、コンストラクタがハンドルをロックして間接参照するので、デストラクタか str() が呼び出されるまで、ユーザーはメモリーを解放してはなりません。デストラクタと str() のどちらかがハンドルをロック解除します。
ユーザーがメモリーの解放に「責任」を持っていることもありますが、実際に GlobalFree() を呼び出すのがクライアントかサーバーかは、DDE の「リリース」フラグによって決まることに注意してください。
#include <rw/winstrea.h> #include <iostream.h> #include <windows.h> #include <dde.h> BOOL postToDDE(HWND hwndServer, HWND hwndClient) { RWDDEstreambuf* buf = new RWDDEstreambuf(CF_TEXT, TRUE, TRUE, TRUE); ostream ostr(buf); double d = 12.34; ostr << "Some text to be exchanged through the DDE.\n"; ostr << "The double you requested is: " << d << endl; ostr.put(0); // 終端ヌルを付ける // streambuf をロックして、そのハンドルを獲得する HANDLE hMem = buf->str(); // 識別アトムを獲得する ATOM aItem = GlobalAddAtom("YourData"); if(!PostMessage(hwndClient, WM_DDE_DATA, hwndServer, MAKELONG(hMem, aItem))){ // メッセージポストが失敗。おそらくクライアントが終了したため。 // この場合、メモリーの割り当てを解除する責任はユーザーにある if( hMem != NULL ) GlobalFree(hMem); GlobalDeleteAtom(aItem); return FALSE; } return TRUE; } |
DDE サーバーのハンドルは、パラメータ hwndServer として、クライアントのハンドルはパラメータ hwndClient として渡されます。関連する streambuf として RWDDEstreambuf を使用して、ostream が作成されます。結果は、Windows 大域メモリーに文字が挿入される以外は、cout などの他の ostream とほぼ同様に使用でき、それから DDE を通して転送することができます。コンストラクタで使用されるパラメータに注意してください。これらは、DDE を通してメモリー割り当てを処理する方法に関して重要な分枝点となるので、以下で検討する必要があります。特に、パラメータ fRelease が TRUE の場合には、完了時にクライアントがメモリーの解放に責任があることを示します。デフォルトでも、fAckReq TRUE を指定します。すなわち、クライアントがメッセージの受信を確認することを意味します。したがって、ユーザーがメッセージを受信する準備をしなければなりません。
いくつかのテキストと倍精度浮動小数点数が ostream に挿入されます。次に、Windows の HANDLE をロック解除して返すメンバー関数 str() が呼び出されます。一度 str() を呼び出すと、このメモリーに関する責任はユーザーにあり、完了時にはそれを解放するか、他の誰かに責任を渡さなければなりません。この場合、クライアントに責任が移ります。
次に、データを特定するためにアトムが作成されます。DDE データが識別用アトムとともに送信されます。送信に失敗した場合は、大域メモリーに対する責任を他の誰かにを押しつけることができないため、ユーザー自身がそれを (アトムとともに) 解放しなければなりません。
RWDDEstreambuf(WORD cfFormat = CF_TEXT, BOOL fResponse = TRUE BOOL fAckReq = TRUE BOOL fRelease = TRUE);
RWDDEstreambuf(HANDLE hMem);
~RWDDEstreambuf();
BOOL ackReq() const;
WORD format() const;
BOOL release() const;
BOOL response() const;
HANDLE str();