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

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

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

我正在使用Windows,因此当我要加载图像时,图像名称必须在LPTSTR中(启用Unicode)。我已经对将Ascii转换为Unicode感到头疼。

对于我的大多数代码,在尝试保存此图像名称之前,此类没有问题。第一次创建和保存图像名称时,仅从main深度创建一个函数即可创建该名称!第二次使用相同的功能创建新的图像名称,但函数调用距离main深3层。当第二级返回到第一级时,我的图像名称超出范围(字符串被覆盖)。

我正在尝试解决问题,但是三天后没有任何反应。

这是我的类(class)设置者代码。尝试解决这个问题是残酷的。

// 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()名称时,它可以工作。第二次进入设置程序,称为If循环,但是在创建新的StaticString时,未分配值。我可能会错误地使用“new”运算符吗?

让我知道是否需要查看更多代码。谢谢。

最佳答案

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



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

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

如果您确实对LPTSTR感到困惑,请使用Windows API函数将数据复制到另一个: StringCchCopy

关于c++ - LPTSTR丢失范围,变通办法不起作用(C++),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30512489/

10-11 22:53