エクスプローラの取り込み
エクスプローラからアドレスを取得するのに以下の様な感じで 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で取得するようにしています。