覚え書きブログ

読者です 読者をやめる 読者になる 読者になる

Windows C++の設定ファイルの読み込み

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");