ページ 11

SetCurrentDirectory関数について

Posted: 2008年12月16日(火) 22:28
by 阿武隈のくま
はじめて投稿します。
現在コンソールアプリケーション(テキストの文字化けを補正するコードを書いています)を作っています。
アプリ自体はsystem32内に入れ、
コマンドラインから
EDL "ファイル名またはパス"
で実行します。
実行すると、変換されたファイルが新たにできるというものです。

どのディレクトリで実行してもデスクトップ上のユーザー指定のフォルダ内に保存されるようにしたいと思っています。
問題は、
LPCWSTR型のポインタ変数に初期設定で、
wchar_t *pathname=L"C:\\Documents and Settings\\EPSON\\デスクトップ";
と設定しても、
SetCurrentDirectory(pathname);
の戻り値を調べると、失敗(0)になってしまいます。
しかし直接、
SetCurrentDirectory(L"C:\\Documents and Settings\\edit-room1\\デスクトップ");
とするとOKになります。
この関数は変数を引数にする場合何か問題があるのでしょうか。
お分かりの方、どうかよろしくお願いします。

Re:SetCurrentDirectory関数について

Posted: 2008年12月16日(火) 22:57
by Justy
 環境は何ですか?


>SetCurrentDirectory(pathname);
>の戻り値を調べると、失敗(0)になってしまいます。

 うーん、何でしょうね。
 ユーザーディレクトリ周りだとアクセスが拒否されているかもしれませんね。

 失敗した直後で WinAPIの GetLastError()を使ってエラーコードを調べて見て下さい。
 或いは VisualStudioが使えるならウォッチウインドウに
[color=#d0d0ff" face="sans-serif]
err
@err,hr
[/color]

 の2つ(或いはどちらかでもいいですが)を入れて、失敗した直後のところで
止めてみれば何かわかるはずです。

Re:SetCurrentDirectory関数について

Posted: 2008年12月16日(火) 23:17
by 御津凪
> ユーザーディレクトリ周りだとアクセスが拒否されているかもしれませんね。

実行者(ユーザー)以外のデスクトップには管理者権限でなければアクセスできないはずです。

それと、
pathname に代入されているパスと、直接入力しているパスが同じではないようですが。
(Documents and Settings の次のディレクトリ名)

もし、複数のユーザーが使うものであれば、
下記を参考にしてデスクトップのディレクトリを取得したほうがいいと思います。
http://athomejp.com/goldfish/api/getdesptop.asp

Re:SetCurrentDirectory関数について

Posted: 2008年12月17日(水) 13:34
by 阿武隈のくま
Justy ..ハッカーさん
御津凪さん

みなさん、ご回答頂きありがとうございます。

Justy ..ハッカーさん
>環境は何ですか?
visual studio 2008です。
>失敗した直後で WinAPIの GetLastError()を使ってエラーコードを調べて見て下さい。
エラーをみましたら、
”指定されたパスが見つかりません” でした。
それで今、確かめましたところ、初期化時に設定したものはokでした。
wchar_t *pathname=L"C:\\Documents and Settings\\EPSON\\デスクトップ";
ですが、このpathnameに利用者がコマンド引数で指定したパス文字列を
mbstowcs関数でwchar_t型に変換して、pathnameに渡すとダメになります。
もしかしてコードページ関係とかなのでしょうか。

御津凪さん
>実行者(ユーザー)以外のデスクトップには管理者権限でなければアクセスできないはずです。
申し忘れましたが、PC自体は複数のユーザーで使用していません。アプリ自体を色んな人が使うという状態です。
ディレクトリの設定は、替えたいときにコマンドの引数で指定して行うかたちです。
なので、初期設定は変数の初期化時に設定していますが、コマンド引数をそのままmbstowcs関数でwchar_t型に変換して、pathnameにポインタを代入しています。
>pathname に代入されているパスと、直接入力しているパスが同じではないようですが。
書き間違えでした。ごめんなさい。同じ名前です。

といった具合です。
よろしくお願いします。

Re:SetCurrentDirectory関数について

Posted: 2008年12月17日(水) 13:49
by YuO
setlocaleはしていますよね。
これをしないと,日本語はワイド文字化されません。

SetCurrentDirectoryWを呼び出す直前に,pathnameの値が正しいことを調べてみるのがよいと思います。
例えば,MessageBoxW APIを使うとか。
# 個人的には,mbstowcs使うくらいならSetCurrentDirectoryAでいいと思う……。

Re:SetCurrentDirectory関数について

Posted: 2008年12月17日(水) 18:36
by 阿武隈のくま
ご回答頂いたみなさん、ありがとうございました。

YuOさん
>SetCurrentDirectoryWを呼び出す直前に,pathnameの値が正しいことを調べてみるのがよいと思います。
盲点でした。
調べましたら、NULL文字の前にスペースが入っていました!

みなさん、ありがとうございました。
スッキリしました。