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 指针是未定义的行为。您需要:

  1. 让调用者提供函数可以写入的缓冲区。
  2. 让函数在堆上分配内存。调用者需要取消分配它。
  3. 开始使用 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++ 库。这将导致代码编写体验更简洁、更安全、更快捷。