タブファイラー開発ブログ

Tablacus ExplorerやX-Finderの作者のブログ

エクスプローラの取り込み

エクスプローラからアドレスを取得するのに以下の様な感じで CWM_GETPATH → SHLockShared で取得していました。 dwProcID := GetCurrentProcessId(); SendMessageTimeout(hWindow, CWM_GETPATH, dwProcID, 0, SMTO_ABORTIFHUNG, 2000, hMem); ItemIDList := SHLockShared(hMem, dwProcID); Result := ILClone(ItemIDList); SHUnlockShared(ItemIDList); SHFreeShared(hMem, dwProcId); Vista で取得できないと言う事で調べたら SHLockShared 等が shell32.dll から無くなっているらしい。情報源は BugTrack-MDIE/83 - MDIE wiki SHLWAPI.DLL に SHLockShared 等がある様なので調整したのが、11-2-27 11-2-27でダメだったので、さらに調べてみると Vista で CWM_GETPATH が動かないと書かれた情報がチラホラ。 ちょっと方向性を変えて IShellWindows でIEエクスプローラの情報が取れるらしいので調整してみました。 SW := CoShellWindows.Create; //IShellWindows取得 spDisp := SW.Item(i); //IDispatch spDisp.QueryInterface(IWebBrowser2, WB); //IWebBrowser2取得 通常パスなら 後、WB.LocationURL でOKだけど、マイコンピュータ等の特殊フォルダは取れないので… WB.QueryInterface(IServiceProvider, SP); //IServiceProvider取得 SP.QueryService(SID_SShellBrowser, IID_IShellBrowser, SB); //IShellBrowser取得 SB.QueryActiveShellView(SV); //IShellView取得 SV.GetItemObject(SVGIO_ALLVIEW, IDataObject, Pointer(dataObj)); //IDataObject取得 といった感じで IDataObject を取得してそこから ItemIDList を取り出しています。 ただ、Window95 でI ShellWindowsは動かないので CWM_GETPATH でダメだったら、IShellWindowsで取得するようにしています。