C++:GetPrivateProfileStringA - 随机值?
C++: GetPrivateProfileStringA - random values?
首先让我说,我已经有好几年(超过 8 年)没有接触过 C++ 了。我又生疏了,看来我得开始做一些副业来掌握它了。
我知道这很简单,而且我确定这是我做错的非常小的事情...我从返回值中收到垃圾字符,但我不明白为什么。也许这与我的编码有关?不确定。
从 Windows 中的 INI 文件中检索值的简单函数:
LPCTSTR getConfigValue(LPCTSTR key) {
char retval[256];
DWORD dw;
if ((dw = GetPrivateProfileStringA("RLWELF", "DestinationIP", NULL, retval, 256, ".\rlwelf.ini")) > 0) {
return NULL;
}
OutputDebugStringA(retval);
return (LPCTSTR)retval;
}
提前致谢!
retval
是一个局部变量,它在函数结束时被销毁,所以当你尝试 return 它时,调用者收到一个指向垃圾的指针。
相反,您可以 malloc 一个缓冲区并 return 它,在参数中获取一个输出指针,或者 return unique_ptr 一个缓冲区。
return (LPCTSTR)retval;
您正在 return 获取局部变量的地址。一旦函数 returns,该局部变量就会被销毁。因此,调用者取消引用 returned 指针是未定义的行为。您需要:
- 让调用者提供函数可以写入的缓冲区。
- 让函数在堆上分配内存。调用者需要取消分配它。
- 开始使用 C++ 标准库和 return
std::string
。
选项 3 遥遥领先。
除此之外,演员阵容令人怀疑。我怀疑您正在编译时定义了 UNICODE
。这意味着 LPCTSTR
扩展为 const wchar_t*
。这反过来意味着你的演员会出错。你会对编译器撒谎。当你对它撒谎时,编译器总是会报复它。
你应该改掉使用TCHAR
的习惯。使用定义的 UNICODE
编译并使用平台本机 UTF-16 字符编码作为文本。
最后,GetPrivateProfileString
是一个非常古老的API,现在不鼓励使用。文档说:
This function is provided only for compatibility with 16-bit Windows-based applications.
如果你必须使用 INI 文件,那么使用一个好的 C++ 库。这将导致代码编写体验更简洁、更安全、更快捷。
首先让我说,我已经有好几年(超过 8 年)没有接触过 C++ 了。我又生疏了,看来我得开始做一些副业来掌握它了。
我知道这很简单,而且我确定这是我做错的非常小的事情...我从返回值中收到垃圾字符,但我不明白为什么。也许这与我的编码有关?不确定。
从 Windows 中的 INI 文件中检索值的简单函数:
LPCTSTR getConfigValue(LPCTSTR key) {
char retval[256];
DWORD dw;
if ((dw = GetPrivateProfileStringA("RLWELF", "DestinationIP", NULL, retval, 256, ".\rlwelf.ini")) > 0) {
return NULL;
}
OutputDebugStringA(retval);
return (LPCTSTR)retval;
}
提前致谢!
retval
是一个局部变量,它在函数结束时被销毁,所以当你尝试 return 它时,调用者收到一个指向垃圾的指针。
相反,您可以 malloc 一个缓冲区并 return 它,在参数中获取一个输出指针,或者 return unique_ptr 一个缓冲区。
return (LPCTSTR)retval;
您正在 return 获取局部变量的地址。一旦函数 returns,该局部变量就会被销毁。因此,调用者取消引用 returned 指针是未定义的行为。您需要:
- 让调用者提供函数可以写入的缓冲区。
- 让函数在堆上分配内存。调用者需要取消分配它。
- 开始使用 C++ 标准库和 return
std::string
。
选项 3 遥遥领先。
除此之外,演员阵容令人怀疑。我怀疑您正在编译时定义了 UNICODE
。这意味着 LPCTSTR
扩展为 const wchar_t*
。这反过来意味着你的演员会出错。你会对编译器撒谎。当你对它撒谎时,编译器总是会报复它。
你应该改掉使用TCHAR
的习惯。使用定义的 UNICODE
编译并使用平台本机 UTF-16 字符编码作为文本。
最后,GetPrivateProfileString
是一个非常古老的API,现在不鼓励使用。文档说:
This function is provided only for compatibility with 16-bit Windows-based applications.
如果你必须使用 INI 文件,那么使用一个好的 C++ 库。这将导致代码编写体验更简洁、更安全、更快捷。