写入 .ini 文件 - SimpleIni SetValue 没有做任何事情,尽管看起来成功了
Writing to .ini file - SimpleIni SetValue not doing anything, despite appearing to succeed
所以我一直在尝试从我的 windows 服务的 .ini 文件中读取和写入。我暂时将 ini 文件存储在 'C:\test\CppWindowsService.ini'。该程序可以很好地读取 ini,但 在 ini 文件中设置值时遇到问题。它似乎更新了值,但实际上什么也没做。 我正在使用 github 上提供的 brofield 的 SimpleIni,我在网上看到很多人使用它来满足他们的 ini 解析需求。你可以找到它 here.
到目前为止我 tried/checked 的事情:
- 安全设置:管理员、域管理员、系统和我都有 read/write 访问权限。这部分代码正在 运行 作为我的域管理员。
非常感谢任何帮助,并提前致谢!
bool readini()
{
// Load .ini file and retrieve ClientGuid **
CSimpleIniA ini;
ini.SetUnicode();
ini.LoadFile("C:\test\CppWindowsService.ini");
const char * pVal = ini.GetValue("GUID", "Clientguid", NULL);
std::cout << "pVal:" << pVal << std::endl;
std::string test(pVal); // Had to convert pVal to string for unknow reason:
if (test == "noguid") // const char * "noguid" != const char[7] "noguid" ???
{ // Aren't these the exact same thing?... Compiler wasn't
// generate guid ** // throwing the error, but the if statement wouldn't pass
GUID initguid; // the condition until I did this.
HRESULT hCreateGuid = CoCreateGuid(&initguid);
// generate bstr from guid **
wchar_t* bstrGuid;
StringFromCLSID(initguid, &bstrGuid);
std::wcout << bstrGuid << std::endl;
// transform bstr to str **
std::stringstream ss;
ss << bstrGuid;
std::string guid = ss.str();
// set .ini clientguid with generated guid **
SI_Error rc = ini.SetValue("GUID", "Clientguid", guid.c_str());
if (rc < 0)
{
return false;
}
printf("key: %s\n", rc == SI_INSERTED ?
"inserted" : "updated");
::CoTaskMemFree(bstrGuid);
}
}
三个不同 cout/wcout/print 语句的输出:
pval: noguid
{D002CD3F-6434-47E9-8246-06884FDE1FEA}
key: updated
ini格式:
[GUID]
Clientguid = noguid
我只包含了 SimpleIni.h 文件,因为其他文件看起来对我来说并不是很有用。这似乎没问题,据我所知,这不是问题......但如果我错了请告诉我!
您需要使用以下命令保存 INI 文件:
ini.SaveFile("C:\test\CppWindowsService.ini");
所以我一直在尝试从我的 windows 服务的 .ini 文件中读取和写入。我暂时将 ini 文件存储在 'C:\test\CppWindowsService.ini'。该程序可以很好地读取 ini,但 在 ini 文件中设置值时遇到问题。它似乎更新了值,但实际上什么也没做。 我正在使用 github 上提供的 brofield 的 SimpleIni,我在网上看到很多人使用它来满足他们的 ini 解析需求。你可以找到它 here.
到目前为止我 tried/checked 的事情:
- 安全设置:管理员、域管理员、系统和我都有 read/write 访问权限。这部分代码正在 运行 作为我的域管理员。
非常感谢任何帮助,并提前致谢!
bool readini()
{
// Load .ini file and retrieve ClientGuid **
CSimpleIniA ini;
ini.SetUnicode();
ini.LoadFile("C:\test\CppWindowsService.ini");
const char * pVal = ini.GetValue("GUID", "Clientguid", NULL);
std::cout << "pVal:" << pVal << std::endl;
std::string test(pVal); // Had to convert pVal to string for unknow reason:
if (test == "noguid") // const char * "noguid" != const char[7] "noguid" ???
{ // Aren't these the exact same thing?... Compiler wasn't
// generate guid ** // throwing the error, but the if statement wouldn't pass
GUID initguid; // the condition until I did this.
HRESULT hCreateGuid = CoCreateGuid(&initguid);
// generate bstr from guid **
wchar_t* bstrGuid;
StringFromCLSID(initguid, &bstrGuid);
std::wcout << bstrGuid << std::endl;
// transform bstr to str **
std::stringstream ss;
ss << bstrGuid;
std::string guid = ss.str();
// set .ini clientguid with generated guid **
SI_Error rc = ini.SetValue("GUID", "Clientguid", guid.c_str());
if (rc < 0)
{
return false;
}
printf("key: %s\n", rc == SI_INSERTED ?
"inserted" : "updated");
::CoTaskMemFree(bstrGuid);
}
}
三个不同 cout/wcout/print 语句的输出:
pval: noguid
{D002CD3F-6434-47E9-8246-06884FDE1FEA}
key: updated
ini格式:
[GUID]
Clientguid = noguid
我只包含了 SimpleIni.h 文件,因为其他文件看起来对我来说并不是很有用。这似乎没问题,据我所知,这不是问题......但如果我错了请告诉我!
您需要使用以下命令保存 INI 文件:
ini.SaveFile("C:\test\CppWindowsService.ini");