Ko-Window プログラマーズマニュアル 「Common 領域について」 ● Common 領域 (または共有領域) 各プロセスから共通にアクセスすることのできるメモリです。それぞれ任意の文字 列による名前をもち、この名前によってどのプログラムでも簡単にその領域をアクセ スすることができます。 ● Common 領域の使われ方 どのプロセスからも平等に参照できるメモリとして、初期設定情報や、プロセス起 動情報の相互参照、Clip Board、または排他的実行におけるロック情報の領域として 用いられます。 ● Common 領域の大きさ Common 領域は、サーバーの HEAP から確保されます。よって確保できるサイズも サーバーの HEAP 領域の大きさに左右されます。+14 以降はこの Common 領域の管理 システムが改良され、特に個数制限を持つようなことはなくなりました。よって WSRV.RC の !Wsrv の項目にある「CommonSize」の設定は意味を持ちません。 ● Common 領域のアクセス Common 領域は全部名前がつけられています。この名前は 15 文字以下でなければ なりません。名前の大文字小文字は明確に区別します。 指定した Common 領域のアドレスを得るには WindowGetCommon( "name", 0 ) を実 行します。もし確保されていればその先頭アドレス、もし確保されていなければ NULL を返します。 新しく Common 領域を確保するには WindowGetCommon( "name", size ) のように 実行します。"name" という名前で size 分の大きさの領域を確保し、そのアドレス を返します。 もしすでに同じ名前の領域が確保されていたならば、その領域をいったん開放して からあらためて size 分だけのメモリを確保しようとします。この時メモリ内容は size 分だけ転送されますが、当然バッファアドレスは変わることになります。 ●実際のアクセス例 -- 共有メモリとしてのアクセス void *ptr; ConsoleOpen(); if( !(ptr= WindowGetCommon( CommonName, 0 )) ){ if( !(ptr= WindowGetCommon( CommonName, CommonSize )) ) ConsolePrint( "Common 領域が確保できませんでした\n" ); } これは、すでに CommonName の領域が確保されているならそのアドレス、もし確保 されていなければ新しく CommonName という名前で CommonSize 分だけ領域を確保し そのアドレスを ptr に返します。 プロセス間で共通のメモリを参照する場合には、この形式がもっともよく使われま す。 プログラムの起動を排他的に行いたい場合ならば、すでに指定の名前の領域が存在 すれば起動をあきらめ、もし起動できたなら EventClose 時に後始末のあとにこの共 有領域を WindowResetCommon() によって開放するようにします。 ●実際のアクセス例 -- Clip Board へのアクセス Clip Board の内容は、ウィンドウマネージャーから UserPaste によって受け取る ことができます。もしプログラム内で、自分から Clip Board の内容を参照したい場 合には、"Clip Board" という名前で共有領域を検索すればいいのです。 unsigned char *cp; if( cp= WindowGetCommon( "Clip Board", 0 ) ){ : } Clip Board にプログラムで文字列を設定するには、次のようにします。 WindowResetCommon( "Clip Board" ); if( cp= WindowGetCommon( "Clip Board", strlen(buf)+1 ) ){ strcpy( cp, buf ); } これは、いったん Clip Board の内容を開放してから(エラーチェックは不用)、文字 列分だけのバッファを確保し直して、内容転送を行っています。 ● Common 領域の初期値 WSRV.RC に「!名前」として記述した内容は、起動後 Common 領域として "名前" で 参照できるようになります。つまり WSRV.RC に記述しているのは、Common 領域の初 期値です。 例えば、WSRV.RC の「!K20」という項目に、KX_Term20 のさまざまな設定を書いて おいたとすれば、WindowGetCommon( "K20", 0 ) とすることで参照することができま す。もちろん "Wsrv" という名前で、サーバーの設定値を参照することもできます。 このように、アプリケーションの設定記述領域として使用する場合、共有領域へ簡 単にアクセスできるようにするための Common ライブラリが提供されています。 CommonOpen() でアクセスする Common 領域の名前を与えたあと、CommonGetLine() や CommonGetWord() によって簡単に文字列を切り出すことができるようになってい ます。ただし、ライブラリ内部では static 領域をワークとして持っているので、同 時に複数の Common 領域を CommonOpen して参照することはできません。もっとも、 内部では WindowGetCommon() によって実装されているだけに過ぎませんので、問題 はないでしょう。 -- 1993/06/22 初期版 1995/11/24 +14でCommonSize設定不要になった 小笠原博之 oga@dgw.yz.yamagata-u.ac.jp DenDenNET: DEN0006 COR.