Claybirdの日記: IContextMenu::GetCommandString()
日記 by
Claybird
Windowsのシェル拡張による右クリックメニューについて、追加したはずのメニューが表示されないバグがあった。これまでIContextMenu::QueryContextMenu()内で問題があると考え、InsertMenuItem()の呼び方が悪いのか、とか、OSの仕様なのか、とかいろいろ試していた。
が、http://blogs.msdn.com/oldnewthing/archive/2004/10/06/238630.aspxを読んでいて、QueryContextMenu()は正常で、GetCommandString()に問題があった事に気づいた。
ドキュメントなどを読むと、どうやら、GetCommandString()がメニューの存在確認も行っているらしい、と言うか、このメソッドで前に追加された古いメニューを消して良い物かどうかの判定をしているらしい。メソッドの名前からは想像しにくい機能だ。
GetCommandString()呼び出し時のフラグに GCS_VALIDATEA / GCS_VALIDATEW があると、存在確認らしいので、適当にS_OKなどを返しておかないと勝手にメニューが消されてしまう。
このあたりのコードを修正すると、今まで動かなかったコードが動くようになった。
IContextMenu::GetCommandString() More ログイン