ページ 11

INIファイルで相対パスを設定する

Posted: 2012年8月30日(木) 14:20
by オカピーα
こんにちは。
今フリーソフトを制作しているのですが、そこでINIファイルを利用しています。
INIファイルは非常に便利で重宝しているのですが、
WritePrivateProfileString関数の第4引数(ファイル名を指定する引数)
を相対パスで指定すると書き込めません。
しかし、絶対パスで指定するとかけます。
フリーソフトとして配布する予定をしているので絶対パスで指定することは出来ません
なんとか相対パスとして指定する方法はないでしょうか?
どなたか教えてください。

言語はWin32API、OSはWindowsXP、コンパイラはVC++ 2008です。

Re: INIファイルで相対パスを設定する

Posted: 2012年8月30日(木) 14:36
by オカピーα
申し訳ないです!
調べた結果、パスを「.\\」と指定すればいいことがわかりました!
INIファイルの仕様を疑っていた僕は本当に馬鹿でした!
申し訳ないです!ごめんなさい!

Re: INIファイルで相対パスを設定する

Posted: 2012年8月30日(木) 14:45
by softya(ソフト屋)
オカピーα さんが書きました:申し訳ないです!
調べた結果、パスを「.\\」と指定すればいいことがわかりました!
INIファイルの仕様を疑っていた僕は本当に馬鹿でした!
申し訳ないです!ごめんなさい!
どういう配布をするのかわかりませんが、Program Files下にINIファイルを作ることはマイクロソフト非推奨の使い方なので注意してくださいね。
特にVista以降だとまともに動かな可能性があります(一見まともに動くから厄介です)。
作業フォルダを取得する専用の手続きがあります。

Re: INIファイルで相対パスを設定する

Posted: 2012年8月30日(木) 14:53
by YuO
GetLastErrorの戻り値は何ですか。
WritePrivateProfileStringはエラーがあった場合は0を返し,詳細な情報はGetLastErrorから得ます。

相対パスが書けない,ということはないと思いますが。

コード:

#include    <windows.h>

int main (void)
{
    // カレントディレクトリの確認
    WCHAR buffer[512];
    ::GetCurrentDirectoryW(512, buffer);
    lstrcatW(buffer, L"\r\n");
    OutputDebugStringW(buffer);

    BOOL result = ::WritePrivateProfileStringW(L"test", L"key", L"value", L".\\test.ini");
    if (!result)
    {
        return ::GetLastError();
    }
    return 0;
}
で,ちゃんとtest.iniがカレントディレクトリにできていました。
ちなみに,L"test.ini"とした場合,C:\Windowsに作られるため,C:\Windowsへの書き込み権限を持ったユーザーのみ利用可能になります。
# GetLastError()は5 : ERROR_ACCESS_DENIEDを返します。

ただ,カレントディレクトリに依存する作りにするとそこら中にiniファイルをばらまくことになるほか,ユーザーごとの設定ができなくなるので,
iniファイルを使うならばSHGetFolderPathCSIDL_LOCAL_APPDATAまたはCSIDL_APPDATAを与えて得たパスにディレクトリを作り,そこに保存するのがよいと思います。