Windows上のC++にて、設定ファイル(.ini)からの設定の読み込みについてのメモ。
GetPrivateProfileStringという、WINAPIの関数を用いる。
https://msdn.microsoft.com/ja-jp/library/windows/desktop/ms724353(v=vs.85).aspx
DWORD WINAPI GetPrivateProfileString( _In_ LPCTSTR lpAppName, _In_ LPCTSTR lpKeyName, _In_ LPCTSTR lpDefault, _Out_ LPTSTR lpReturnedString, _In_ DWORD nSize, _In_ LPCTSTR lpFileName );
この関数は下記のように利用することができる。
【C++コードの抜粋】
TCHAR retStr[256]; DWORD dwLen=0; dwLen=GetPrivateProfileString(L"server",L"ipAddress",L"127.0.0.1",retStr,255,L"C:\\test.ini");
【test.ini】
[server] ipAddress=192.168.11.4
ここで、LPTSTRなどはWindowsならではのワイド文字に対応した型であり、下記のような対応関係になっているとのこと。
LPSTR = char*
LPCSTR = const char*
LPWSTR = WCHAR*
LPCWSTR = const WCHAR*
LPTSTR = TCHAR*
LPCTSTR = const TCHAR*
先のプログラムで読み込んだ値retStrは、TCHAR型になっているのだが、TCHAR型は、ユニコード(ワイド文字)と非ユニコード(マルチバイト文字)両方を扱える汎用的な型となっている。つまり、コンパイラでUNICODEを使用するように設定している場合は、TCHAR型は、WCHAR型扱いで、UNICODEを使用しないように設定している場合は、char型扱いとなる。
ただし、プログラム全体でマルチバイトのchar型を用いている場合は、これらのワイド文字をWideCharToMultiByteを用いることマルチバイト文字(char)に変換しなければならいあので、結構面倒くさい。
そこで、最初からASCIIコード以外のユニコード(マルチバイト)文字を設定ファイルに使わない場合は、最初からマルチバイトで読み込んだ方がプログラム的にはすっきりする。マルチバイトで読み込むためには、GetPrivateProfileStringAを用いる。
GetPrivateProfileStringAを用いた場合のプログラムは以下のようになる。
char retStr[256]; DWORD dwLen=0; dwLen=GetPrivateProfileStringA("server","ipAddress","2",retStr,255,"C:\\test.ini");
ちなみに、カレントディレクトリに設定ファイルがある場合は以下のように指定することができる。
char retStr[256]; DWORD dwLen=0; dwLen=GetPrivateProfileStringA("server","ipAddress","2",retStr,255,".\\test.ini");