ディレクトリのパスを取得するには


にゃおん  2008-01-28 14:17:58  No: 67379  IP: 192.*.*.*

.NET2005  VISTA  MFCです。

ディレクトリのパスの取得の方法について質問します。

たとえば、アプリケーションのあるディレクトリのパスを取得する場合は、
GetCurrentDirectoryでも、相対パスにしてもいいと思うのです。
でも、「ドキュメント」のバスを取得しようとすると、
c:ユーザー\hoge\ドキュメント のようになって、hoge の部分はPCによって違いますから、
アプリケーションを他のPCに移植した場合、「ドキュメント」を見つけることが、
できなくなってしまうと思うのです。

こうした場合、「ドキュメント」のパスは、どのように取得すればいいのでしょうか。
アプリがドキュメントの下位にあるとして、GetCurrentDirectoryでパスを取得して、Find で文字列の中から「ドキュメント」の位置を探すくらいしかないのでしょうか。

編集 削除
maru  2008-01-28 15:43:31  No: 67380  IP: 192.*.*.*

マイドキュメントのパスを知りたいって話?
それならSHGetSpecialFolderPath()って関数があるけど。
VISTAでうまく動くかどうかは知らない。

編集 削除
YuO  2008-01-28 15:56:30  No: 67381  IP: 192.*.*.*

> たとえば、アプリケーションのあるディレクトリのパスを取得する場合は、
> GetCurrentDirectoryでも、相対パスにしてもいいと思うのです。

だめです。「カレントディレクトリとは何か」ということをちゃんと考えてください。
ショートカット作って作業フォルダを指定して実行してみれば,だめな理由が分かるかと思います。

実行ファイルのあるディレクトリを取得するには,GetModuleFileNameとPathRemoveFileSpecを使って,実行ファイルのファイル名から取得する必要があります。

> こうした場合、「ドキュメント」のパスは、どのように取得すればいいのでしょうか。

SHGetFolderPathにCSIDL_MYDOCUMENTSやCSIDL_PERSONALを渡せば取得出来ます。

編集 削除
maru  2008-01-28 16:59:51  No: 67382  IP: 192.*.*.*


> それならSHGetSpecialFolderPath()って関数があるけど。

YuOさん
> SHGetFolderPathにCSIDL_MYDOCUMENTSやCSIDL_PERSONALを渡せば取得出来ます。

SHGetSpecialFolderPath()の方が古いみたいですね。

編集 削除
シャノン  2008-01-28 17:40:25  No: 67383  IP: 192.*.*.*

Vista以降で推奨される方法は、
SHGetKnownFolderPath / SHGetKnownFolderLocation
です。
これ使うと、Vista以前のOSでは動かなくなってしまいますけど。

編集 削除
にゃおん  2008-01-28 20:23:34  No: 67384  IP: 192.*.*.*

ありがとうございます。

SHGetFolderPathについて、検索してみたところ、

HRESULT SHGetFolderPathA(
    HWND   hwndOwner,
    int    nFolder,
    HANDLE hToken,
    DWORD  dwFlags,
    LPTSTR pszPath
);

というのがありました。
この最後の引数について、そのページでは、

パス名を表わすヌル終端文字列を格納するバッファのアドレスを指定します。このバッファのサイズは少なくとも 260 (MAX_PATH) バイト(Unicode 版の場合は 260 (MAX_PATH) 文字)以上でなくてはなりません。関数が失敗するか、 (S_FALSE) を返した場合は、空文字列になります。

となっているのですが、これが分りません。

SHGetFolderPathA(NULL, CSIDL_MYDOCUMENTS, NULL, FALSE, LPTSTR pszPath);
のLPTSTR pszPathには、具体的に、何を入れればいいのでしょうか。

また、パスは戻り値かと思ったのですが、戻り値は、

HRESULT 型のコード(エラーの場合に最上位ビットがセットされる)が返ります。

となっていて、違うようです。
どこで取得できるのでしょうか。
お恥ずかしいのですが、初心者でよくわかりません。
アドバイスを頂けませんでしょうか。

また、SHGetKnownFolderPath / SHGetKnownFolderLocationは、
検索しても、参考になるようなページがヒットしませんたでした。
こちらについても、アドバイスを頂けませんでしょうか。

よろしくお願いいたします。

編集 削除
にゃおん  2008-01-28 20:40:29  No: 67385  IP: 192.*.*.*

すみません、自己解決できました。

5番目の引数に、パスが入ってくるのですね。
たいへん失礼いたしました。
ありがとうございました。

編集 削除