2005年10月14日

10月7日分のフォロー

該当スレッドを見れば一目瞭然ですが、一応こちらでもフォロー。

10/07の、他プロセスのメモリへのちょっかい@タブコントロールで、サンプルとして(コメントアウトながら)タスクバーのやり方も書いていました。

その後の調査で、どうやらタスクバーのタブボタンの文字列はどうやらTCIF_TEXTでは取得できないようだと言うことが分かりました。かわりにTCIF_PARAMでウィンドウハンドルを取得してEM_GETTEXTで代用するという手法に落ち着きましたが。

何故こんな仕様になってるのかは謎です。或いは何か見落としでもあるんでしょうか……。

それから更に書き忘れていましたが、VirtualAllocExはWinNT系限定の関数です。ですから9x系では他の手段を考えなければなりません。幸いと言うべきか、9x系ではメモリ空間の管理はもうちょっとルーズになっています。ページングファイルに対してメモリマップトファイルを作成し、それのビューを作成すると、そのビューはあらゆるプロセスが全く自らのメモリ空間であるかのように扱うことができるようになるのです。

なんだ、そんな手段があるのならNT系でも……というわけにはいきません。メモリマップトファイルを使用することで各プロセスから共有できるメモリ領域を確保することはできます。しかし、NT系ではメモリ空間の管理が厳しいため、どのプロセスからでもアクセスできる一意のアドレスなんてものは認めません。必ずそのプロセス独自のビューを使用する必要があります。これでは同じアドレスが同じものを指すと言う状態にはできません。両者が「この名前の共有メモリのこれだけの領域を使うよ」という合意をした上でようやく使用できるものと考えるべきでしょう。

メモリマップトファイルは作成時に名前を付けることができます。で、他のプロセスはその名前でもって作成済みのメモリマップトファイルにアクセスすることが可能です。Mutexなんかと同じです(使用する名前はMutexなどと同じ機構を使用するため、Mutexとメモリマップトファイルの間でも名前がバッティングしたら後から作ろうとした方が失敗します)。

簡単に手順だけ書くと、CreateFileMapping関数を、ファイルハンドルにINVALID_HANDLE_VALUEを指定して呼び出すことでページングファイルに対してファイルマッピングオブジェクトを作成します。要は全てのプロセスから参照可能なメモリ領域を確保するって事ですね。で、これだけではアドレスがまだ不明のままです。ここで確保した領域のアドレスを取得するのがMapViewOfFile関数です。つまり、どこか適当に確保した領域を、ローカルで扱えるように仮想アドレス空間にマッピングするってわけですね。前述の通り、9x系ではこれでマッピングされたアドレスはグローバルに扱うことが可能な特殊なアドレスになります。グローバルに扱えますから、マッピングしたアドレス(ビュー)は他のプロセスへのSendMessageなんかにもそのまま使用できるというわけです。使い終わったらMapViewOfFileしたアドレスはUnmapViewOfFile、CreateFileMappigしたファイルマッピングオブジェクトはCloseHandleするのを忘れないように。



posted by Hongliang at 00:35| Comment(3) | TrackBack(0) | .NET | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
レディースウォッチ ケイト ファッション http://www.jyqcmy.com/
Posted by ケイト ファッション at 2013年08月02日 15:29
ファッション
Posted by moncler アウトレット at 2013年08月05日 15:35
レディース バッグ ブランド 人気時計 http://www.advanceshopboughjp.biz/
Posted by 人気時計 at 2013年08月13日 11:03
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。

この記事へのトラックバック

ここ(hongliang.seesaa.net)で公開しているものについて、利用は自由に行って頂いて構いません。改変、再頒布もお好きになさって下さい。利用に対しこちらが何かを要求することはありません。

ただし、公開するものを使用、または参考したことによって何らかの損害等が生じた場合でも、私はいかなる責任も負いません。

あ、こんなのに使ったってコメントを頂ければ嬉しいです。