.NET2005 VISTA MFCです。
ディレクトリのパスの取得の方法について質問します。
たとえば、アプリケーションのあるディレクトリのパスを取得する場合は、
GetCurrentDirectoryでも、相対パスにしてもいいと思うのです。
でも、「ドキュメント」のバスを取得しようとすると、
c:ユーザー\hoge\ドキュメント のようになって、hoge の部分はPCによって違いますから、
アプリケーションを他のPCに移植した場合、「ドキュメント」を見つけることが、
できなくなってしまうと思うのです。
こうした場合、「ドキュメント」のパスは、どのように取得すればいいのでしょうか。
アプリがドキュメントの下位にあるとして、GetCurrentDirectoryでパスを取得して、Find で文字列の中から「ドキュメント」の位置を探すくらいしかないのでしょうか。
マイドキュメントのパスを知りたいって話?
それならSHGetSpecialFolderPath()って関数があるけど。
VISTAでうまく動くかどうかは知らない。
> たとえば、アプリケーションのあるディレクトリのパスを取得する場合は、
> GetCurrentDirectoryでも、相対パスにしてもいいと思うのです。
だめです。「カレントディレクトリとは何か」ということをちゃんと考えてください。
ショートカット作って作業フォルダを指定して実行してみれば,だめな理由が分かるかと思います。
実行ファイルのあるディレクトリを取得するには,GetModuleFileNameとPathRemoveFileSpecを使って,実行ファイルのファイル名から取得する必要があります。
> こうした場合、「ドキュメント」のパスは、どのように取得すればいいのでしょうか。
SHGetFolderPathにCSIDL_MYDOCUMENTSやCSIDL_PERSONALを渡せば取得出来ます。
私
> それならSHGetSpecialFolderPath()って関数があるけど。
YuOさん
> SHGetFolderPathにCSIDL_MYDOCUMENTSやCSIDL_PERSONALを渡せば取得出来ます。
SHGetSpecialFolderPath()の方が古いみたいですね。
Vista以降で推奨される方法は、
SHGetKnownFolderPath / SHGetKnownFolderLocation
です。
これ使うと、Vista以前のOSでは動かなくなってしまいますけど。
ありがとうございます。
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は、
検索しても、参考になるようなページがヒットしませんたでした。
こちらについても、アドバイスを頂けませんでしょうか。
よろしくお願いいたします。
すみません、自己解決できました。
5番目の引数に、パスが入ってくるのですね。
たいへん失礼いたしました。
ありがとうございました。
ツイート | ![]() |