我在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;
答案 0 :(得分:2)
Oups,在Windows下点击ini文件并不那么容易。在两次尝试(v1和v2)中,您在当前目录中查找文件,然后在Windows
目录中查找,但不在可执行文件所在的目录中查找。
简单的方法是将所有ini文件放在Windows目录下。如果你发现清洁文件中包含ini文件和exe文件,你还有一些工作要做:
exe
结尾替换为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());