開発じたばた日誌

前へ●●●次へ
じたばた日誌目次へ戻る
TSUCHY Softへ戻る


情報が取得できない 編

 最初の構想では、ショートカットのタイトル「***へのショートカット」という文字とその位置を取得し、 記憶しておこうと考えました。これだけ記憶しておけば、位置を元に戻すときも簡単です。
 リストビューのポインタを取得し、タイトルを取得する関数を発行しました。見事にクラッシュ! なんとエクスプローラが死んでしまうのです。
 なんということ、一番簡単そうなところでつまずくとは。いったいどこがまずいのでしょう。 私はMFCのポインタを使っているのがまずいのではと想像しました。 ではハンドルとメッセージを使った、最も基本的な方法でやってみましょう。えい、SendMessage。

 自体は全く改善されません。エクスプローラは何回も死亡しました。

 ところが奇妙なことがわかりました。状態を取得する関数では失敗しますが、情報を設定する関数では成功します。 前述のように、デスクトップのリストビューの見え方を変更する関数を発行すると成功します。 MFCのメンバ関数でも成功しました。

 原因はハンドルとかMFCとかではないようです。私は成功した関数と失敗した関数をじーっとにらみ、はたと気づきました。 状態を取得する関数では、ポインタを渡しています。
成功する BOOL SetItemPosition( int nItem, POINT pt );
失敗する BOOL GetItemPosition( int nItem, LPPOINT lpPoint );
 ポインタ!! 関数の中ではどんなことが行われるのでしょう。
 この関数は結局デスクトップ(Program Manager)にメッセージを送り、受け取ったウィンドウは該当する仕事をします。 位置を設定する関数では、リストビューは位置を見て、自分のアイテムの位置を変更します。 位置を取得する関数では、リストビューは該当するポインタにアイテムの位置を書き込みます。

 さてこの書き込みはどこにされるのでしょう?そのポインタはショートカットモトドーラのメモリー空間のポインタです。 そのポインタを使って別アプリのリストビューが書き込みをします。クラッシュするのは当然です。

 じゃあ、じゃあ、GetWindowTextはどうしてうまくいくんだよ。この疑問がでます。 最近呼んだプログラミング誌に解説してありましたが、16ビット時代から存在するAPIは互換性のために Windowsが裏で操作するらしいのです。

1998.11.23