宿題の答えが(とりあえず)わかったので報告しておきます。
Vistaエクスプローラに渡す引数のうち,フォルダ指定部分(デバイスのフォルダ名+@)は「\Windows\スタート メニュー\」の場合「f%7CF%7C%5CWindows%5Cスタート%20メニュー%5C」でした。しかしこれを用いたコマンドでは(開くこと自身はできるのですが)以下のようにVistaエクスプローラのパンくずリストにフォルダツリーの中間部分が表示されません。

矢印部分に本来あるべき「Windows」フォルダが抜けています。(以上復習です。)
これを避けるためにはエクスプローラに渡す引数のうちフォルダ指定部分にもう一工夫します。
パンくずリストに載せるためのフォルダを上位からフルパスで順々に記述します。そのいちいちに頭に「f%7CF%7C」が必要です。間には "\" を用います。
すなわち,「\Windows\スタート メニュー\」を開くためのフォルダ指定は以下になります。
f%7CF%7C%5CWindows%5C\f%7CF%7C%5CWindows%5Cスタート%20メニュー%5C「Windows」が二度出現していることに注意してください。一部エンコードされた「\Windows\」と「\Windows\スタート メニュー\」をエンコードされない「\」でつなげているわけです。
おわかりの通り,フォルダの深さの分だけどんどん冗長になります。
「\Windows\スタート メニュー\プログラム\ゲーム\」を開こうとする場合は,
f%7CF%7C%5CWindows%5C\f%7CF%7C%5CWindows%5Cスタート%20メニュー%5C\f%7CF%7C%5CWindows%5Cスタート%20メニュー%5Cプログラム%5C\f%7CF%7C%5CWindows%5Cスタート%20メニュー%5Cプログラム%5Cゲーム%5Cとなります。
前記事の例を用いて全引数を書くと,
::{20D04FE0-3AEA-1069-A2D8-08002B30309D}\\\?\activesyncwpdenumerator#umb#2&306b293b&0&activesyncwpddevice-d9435669-f425-3ee0-ff5e-aef68e4683ee-#{6ac27878-a6fa-4155-ba85-f98f491d4f33}\f%7CF%7C%5CWindows%5C\f%7CF%7C%5CWindows%5Cスタート%20メニュー%5C\f%7CF%7C%5CWindows%5Cスタート%20メニュー%5Cプログラム%5C\f%7CF%7C%5CWindows%5Cスタート%20メニュー%5Cプログラム%5Cゲーム%5Cとなるわけです。
さて,このほれぼれする引数のエクスプローラへの渡し方です。コマンドプロンプトやCreateProcessで「explorer.exe /n, [上記引数]」とすると,浅いフォルダの場合は正しく機能してくれますが,深いフォルダを指定するとおそらくその長さのせいで(!)正しくフォルダを開いてくれません。(MobSync1.1.6ではCreateProcessを用いているために深いフォルダを開くことができていません。)
ShellExecuteを用いるのが吉です。コマンド (lpVerb) は "open",ディレクトリ指定 (lpFile) に上記引数文字列を指定します。
結果は以下です。

無事に中間部分も表示されていますねっっっ。
しかしなお左のツリーペインを見ると,「Windows」が「\」の下にあるのではなく,直接「○○のPDA2」に直接ぶらさがっています。これはちょっと変です。一方「miniSDカード」以下のフォルダを指定して同様のことをするとツリーペインでも正しく「miniSDカード」の下にぶら下ります。指定フォルダがメインメモリ上にあるのか外部メモリ上にあるのかを判別してフォルダ指定を変えてやる必要がありそうです。…。
…もうひとふんばり。
RAPIのCeGetFileAttributesで一番浅いフォルダの属性を得ます。(\Windowsとか\miniSDカードです。)この属性にFILE_ATTRIBUTE_TEMPORARY属性が立っていたら外部メモリがマウントされたフォルダだと考えてよいようです。
外部メモリならそのまま,そうでなければさらにフォルダ指定の頭に「f%7CF%7C%5C」を足してやります。…

長きにわたる試行でした。とにかく,以上でこの件に関しては終了です。終了させてください。
役にたった方,感心した方,あきれた方,もっといい答えを知っている方はぜひコメントを残していってくださいませ。お疲れさまでした。
≪ 続きを隠す











