|
僕の方でお返事させていただきます。
> @普段秀丸のC++のインプロセスからテキストを得る際に、
> どのような経路でテキストを入手していますか?
秀丸エディタの中でのテキストデータは、単純な1つのメモリブロックに全部
入れてる訳じゃなくて、細かいブロックに分けた上で、それぞれのブロックが
「メモリ上で書き換え可能な状態」、「メモリ上で参照のみ可能な状態」、「テ
ンポラリファイル上にあってメモリ上に無い状態」の3種類存在するような、そ
ういうややこしい管理をしています。
あと、元々ユニコード対応じゃないのを無理矢理ユニコード対応にしてる(未
だにWindows98とかも対応してる)関係もあって、内部のデータの形式が、基本
Shift-JIS形式で、Shift-JISの範囲から外れる文字(ユニコード文字)は、独自
の方式で4バイトにして持つような、ややこしいこともしています。
この辺の内部構造はどこにも公開してないです。
ユニコードを4バイトに変換してる形式については、特定のユーザーさん(特
別に速度を必要とする変換モジュールの作者さん)にだけは公開してますけども。
ご質問の「どのような経路で」ってことになると、それは普通のC++の関数
callでってことになります。
> その際、何らかのクラスウィンドウを経由させていますか?
> (上記、Hm32Client等々)
ウィンドウのメッセージを経由して取得するような方法は無いと思います。
> Aカレット位置に関しても同様の質問となります。
カレット位置も、内部的に、x,y座標を持ってるだけで、普通の変数として持
ってるだけになります。
> インプロセスからカレット位置を入手する際は、どのような経路で
> 入手していますか?
普通に変数を参照してるだけになります。
天翔記さんの作成されるdllからこの辺のデータにアクセスしたいってことで
あれば、やるとしたら、hidemaru.exeに何か関数をエクスポートしてそれを呼び
出してもらう作戦はあるかと思います。
簡単なのは、hidemaru.exeに関数を用意して、LoadLibraryして
GetProcAddressして呼び出してもらう作戦ですけども。
単純に、現在編集中のテキストデータ全体を1つのメモリブロック
(ユニコードの文字列)にして返す用の、
HGLOBAL GetTotalText();
とか、カーソル位置を取得する用の
void GetCaretPos( int* pxOut, int* pyOut );
みたいな関数を用意する程度ならやってもいいかなぁと思いますけども。
|
|