TortoiseBzr のシェル拡張のバグ

http://msdn.microsoft.com/en-us/library/bb776094%28VS.85%29.aspx
GetCommandString() の idCmd は、QueryContextMenu の中で InsertMenuItem 等で設定した id ではなくて、その id と QueryContextMenu の引数の idCmdFirst とのオフセットが渡される?とりあえずこれでステータスバーに正しいメッセージが出るようになったのでよしとする。
TortoiseBzr の GetCommandString() の中にはもうひとつバグがあった。uFlags の GCS_HELPTEXTW や GCS_VALIDATEW といったW系のフラグは、A系のフラグにGCS_UNICODEビットを立てたものなのだが、 if (uFlag & GCS_VALIDATEW) みたいに判定していて、Unicode系のフラグを全部最初の if 文で処理してしまっていた。これは間違えようがないように switch case に書き換えた。

http://msdn.microsoft.com/en-us/library/bb776096%28VS.85%29.aspx
InvokeCommand() は、基本的にQueryContextMenuでInsertMenuItemしたCOMの物が呼ばれるのだが、CMINVOKECOMMANDINFO::lpVerb がコマンドIDではなくてコマンド名を指すような場合、InsertMenuItemしたCOMではなくてもInvokeCommand()が呼ばれてしまう。この場合、E_FAILを返すと次の候補のInvokeCommand()が呼ばれるというチェインになっているので、自分が扱っているコマンドでなかったらE_FAILを返すべきなのだが、TortoiseBzrはS_FALSEを返してしまっていた。このせいで、「新しいフォルダ」ボタンなんかが動かなくなってしまっていた。

両方とも修正してlp:tortoisebzrにpushした。bzr-1.17.1 のインストーラ版に入れてもらえるかな?

このブログに乗せているコードは引用を除き CC0 1.0 で提供します。