バナーをクリックすれば目次に戻ります
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();
