古い OS (Windows) を対象としたコードは冗長になりがちです。
例えば特殊フォルダ (シェルフォルダ) を得る関数は古い OS を考慮すると以下の URL にあるようなコードになってしまいます。
[シェルフォルダ - Windows Vista対応アプリを作る (Delphi VCL Tips)]
http://ht-deko.minim.ne.jp/tech005.html
// Windowsの特殊フォルダを取得 function GetSpecialFolderPath(hwndOwner: THandle; var Path: String; nFolder: Integer): Boolean; var Buf: PChar; { _GetSpecialFolderPath begin } function _GetSpecialFolderPath(hwndOwner: THandle; var lpszPath: PChar; nFolder: Integer; fCreate: Boolean): Boolean; var pidl: PItemIDList; pMalloc: IMalloc; begin result := False; if SHGetMalloc(pMalloc) <> NOERROR then Exit; if SHGetSpecialFolderLocation(hwndOwner, nFolder, pidl) = NOERROR then Exit; if SHGetPathFromIDList(pidl, lpszPath) then result := True; pMalloc.Free(pidl); end; { _GetSpecialFolderPath end } begin result := True; Buf := StrAlloc(MAX_PATH); try if SHGetSpecialFolderPath(hwndOwner, Buf, nFolder, False) then Path := ExcludeTrailingPathDelimiter(StrPas(Buf)) else if _GetSpecialFolderPath(hwndOwner, Buf, nFolder, False) then Path := ExcludeTrailingPathDelimiter(StrPas(Buf)) else result := False; finally StrDispose(Buf); end; end;
なんとメンドイ。しかも現在では SHGetSpecialFolderPath() / SHGetSpecialFolderLocation() は非推奨 API となっています。
SHGetSpecialFolderPath() -> ShGetFolderPath()
SHGetSpecialFolderLocation() -> SHGetFolderLocation()
今現在ならば、上記コードはシンプルに書けます。
function GetFolderPath(nFolder: Integer): string; var LStr: array [0..MAX_PATH] of Char; begin SetLastError(ERROR_SUCCESS); if SHGetFolderPath(0, nFolder, 0, 0, @LStr) = S_OK then result := LStr; end;
Windows 2000 以降ならこれで OK なハズです。このように、昔の情報のままだとやたらとコードを記述しなくてはならなかったりします。これも所謂バッドノウハウの一種です。
…しかしながら、Vista 以降では SHGetFolderPath() すら SHGetKnownFolderPath() のラッパーとなっています。
SHGetSpecialFolderPath() -> ShGetFolderPath() -> SHGetKnownFolderPath()
SHGetSpecialFolderLocation() -> SHGetFolderLocation() -> SHGetKnownFolderIDList()
おいおいってな感じですね。
特殊フォルダ (シェルフォルダ) に関する詳細は Mr.XRAY さんとこの記事をご覧下さい。
See Also:
[460_特殊フォルダのフルパスを取得 (Mr.XRAY)]
http://mrxray.on.coocan.jp/Delphi/plSamples/460_SpecialFolderPath.htm
|