gpt4 book ai didi

c++ - LPTSTR Losing Scope,变通无效 (C++)

转载 作者:行者123 更新时间:2023-11-30 03:52:45 25 4
gpt4 key购买 nike

编辑:解决方案是将 LPTSTR 替换为 wstring。当 Windows API 需要 LPTSTR 时,将使用 .c_str() 转换 wstring

我的问题是,一个变量 (LPTSTR) 超出了范围,我无法修复它。我会解释...

在我的代码中,我试图将图像的名称保存在一个类中。我正在使用的Class保存了函数限制、标志和其他需要保存的变量,例如原始文件目录。

我使用的是 Windows,因此当我想加载图像时,图像名称需要位于 LPTSTR 中(已启用 Unicode)。我已经对 Ascii 到 Unicode 的转换感到头疼了。

对于我的大部分代码,在我尝试保存此图像名称之前,我对此类没有任何问题。第一次创建和保存图像名称时,名称仅在 main 的一个函数深处创建,并且有效!我第二次用相同的函数创建一个新的图像名称,但函数调用距离 main 有 3 级深。当第 2 级返回到第 1 级时,我的图像名称超出范围(字符串被覆盖)。

我正在尝试变通,但 3 天后,没有任何效果。

这是我的类 setter 代码。这是残酷的,因为它试图成为一种解决方法。

// From the Limit.h
void Set_BMPName(LPTSTR S);
LPTSTR BMPName;

// From the Limit.cpp
void Limit::Set_BMPName(LPTSTR S)
{// This function should set BMPName to S.
static LPTSTR* StaticString = new LPTSTR(S);
// I used static to stop the variable from going out of scope.
if (*StaticString != S)
{ // Because StaticString is static, it wont get updated if the name is changed.
delete StaticString;
// So delete it.
static LPTSTR* StaticString = new LPTSTR(S);
// And remake it..
}
BMPName = *StaticString;
// Then set BMPName to this Static variable.
return;
};

我第一次调用 Set_BMPName() 名称时它起作用了。第二次调用 setter 时,进入了 If 循环,但是当生成新的 StaticString 时,没有分配值。我可能错误地使用了“new”运算符吗?

如果您需要查看更多代码,请告诉我。谢谢。

最佳答案

看,这就是 Microsoft 给出的指针类型名称看起来不像指针的问题。

Long pointer to TCHAR string (source)

您的 LPTSTR 实际上并不包含一个字符串;就像 char*(或 wchar_t*)一样,它只是指向一个。您可以随心所欲地使用指针的生命周期,但这不会对实际数据做任何事情。当然,动态分配指针(虽然是一种创造性的尝试)无济于事。

为什么不使用适当的 C++ 技术,如 std::string(或 std::wstring)呢?然后你将在三分钟内完成,而不是三天。 :-)

如果您真的LPTSTR 困住了,那么请使用专用于将一个数据复制到另一个的 Windows API 函数:StringCchCopy .

关于c++ - LPTSTR Losing Scope,变通无效 (C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30512489/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com