c ++使用GetPrivateProfileString读取配置文件参数

时间:2014-09-19 08:35:29

标签: c++ visual-studio-2012 configuration-files

我在C ++,Visual Studio 2012中有一个win32控制台应用程序。我无法从ini文件中获取配置参数。我尝试了使用文件路径的不同可能性,例如将.ini文件放在源文件夹中,将完整路径写入is,放入生成的.exe文件的文件夹中。执行.exe文件后,控制台上的输出在每种情况下都为0或(null)。我做错了什么?如何阅读参数?

v1:
LPCTSTR path = L".\\config.ini";
TCHAR protocolChar[32];
int port = GetPrivateProfileString(_T("PORT"), _T("SETTINGS"), _T(""), protocolChar, 32, path);
printf("***%d***\n", port);

v2:
int port = GetPrivateProfileInt(_T("PORT"), _T("SETTINGS"), 0, _T("config.ini"));

config.ini包含:

[SETTINGS]
USER_NUM_MAX = 256  ; Maximum number of users
PORT = 8080; 

2 个答案:

答案 0 :(得分:2)

Oups,在Windows下点击ini文件并不那么容易。在两次尝试(v1和v2)中,您在当前目录中查找文件,然后在Windows目录中查找,但不在可执行文件所在的目录中查找。

简单的方法是将所有ini文件放在Windows目录下。如果你发现清洁文件中包含ini文件和exe文件,你还有一些工作要做:

  • 找到可执行文件的完整路径
  • exe结尾替换为ini
  • 使用该完整路径访问您的私人ini文件

要获取可执行文件的名称,只需使用带有GetModuleFileName的{​​{1}}:

HMODULE

或者如果您希望直接获取ini文件名:

LPCTSTR getExecPath() {
    DWORD len = 64;
    for (;;) {
        LPTSTR fileName = new TCHAR[len];
        if (len == ::GetModuleFileName(NULL, fileName, len)) {
            delete fileName;
            len *= 2;
        }
        else {
            return fileName;
        }
    }
}

并且不要忘记在完成后删除文件名,因为它已分配了新的...

根据评论编辑:

作为参考,windows目录可能依赖于Windows版本。但它总是可以通过API函数LPCTSTR getIniName() { DWORD len = 4; for (;;) { LPTSTR fileName = new TCHAR[len]; if (len == ::GetModuleFileName(NULL, fileName, len)) { delete fileName; len *= 2; } else { ::lstrcpy(fileName + lstrlen(fileName) - 3, "ini"); return fileName; } } } 检索。摘自reference page

GetWindowsDirectory

参数

  • UINT WINAPI GetWindowsDirectory( _Out_ LPTSTR lpBuffer, _In_ UINT uSize ); 指向接收路径的缓冲区的指针。除非Windows目录是根目录,否则此路径不以反斜杠结尾。例如,如果Windows目录在驱动器C上命名为Windows,则此功能检索的Windows目录的路径为C:\ Windows。如果系统安装在驱动器C的根目录中,则检索的路径为C:。
  • lpBuffer [out] lpBuffer参数指定的缓冲区的最大大小,在TCHAR中。该值应设置为MAX_PATH。

返回值

如果函数成功,则返回值是复制到缓冲区的字符串的长度,在TCHAR中,不包括终止空字符。

如果长度大于缓冲区的大小,则返回值是保存路径所需的缓冲区大小。

如果函数失败,则返回值为零。要获取扩展错误信息,请调用GetLastError。 *

答案 1 :(得分:0)

当我从VS2010更新到VS2012时,我遇到了这个问题。

在VS 2010上,我只是使用.ini文件的文件名作为lpFileName(see MSDN Documentation)的参数调用该函数。

这不再适用于VS 2012,所以我改为完成这样的完整路径:

char directoryPath[MAX_PATH];
char readParameter[MAX_STR_LEN];

GetCurrentDirectory( directoryPath, MAX_PATH );

string directoryPathAsString(directoryPath);
directoryPathAsString = directoryPathAsString + "\\" + filename;

GetPrivateProfileString("section","parameter","0",readParameter,MAX_STR_LEN, directoryPathAsString.c_str());