開発じたばた日誌
前へ●●●次へ
じたばた日誌目次へ戻る
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