LPTSTR Losing Scope, работа вокруг не работает (C ++)

РЕДАКТИРОВАТЬ: Решение было заменить LPTSTR на wstring. Когда Windows API требуется LPTSTR, wstring преобразуется с помощью .c_str ()

Моя проблема в том, что переменная (LPTSTR) выходит из области видимости, и я не могу это исправить. Я объясню…

В своем коде я пытаюсь сохранить имя изображения в классе. Класс, который я использую, сохраняет ограничения функций, флаги и другие переменные, которые необходимо сохранить, например, исходный каталог файлов.

Я использую Windows, поэтому, когда я хочу загрузить изображение, имя изображения должно быть в LPTSTR (Unicode включен). У меня уже болит голова о преобразованиях Ascii в Unicode.

Для большей части моего кода у меня не было проблем с этим классом, пока я не попытался сохранить это Имя изображения. В первый раз, когда имя изображения создается и сохраняется, имя создается только одна функция глубоко от основного, и это работает! Во второй раз я создаю новое имя изображения с той же функцией, но вызов функции находится на 3 уровня ниже основного. Когда 2-й уровень возвращается на первый уровень, имя моего изображения выходит за рамки (строка перезаписывается).

Я пытаюсь сделать работу вокруг, но через 3 дня ничего не работает.

Вот мой код для установщика класса. Это жестоко, так как пытается обойти это.

// 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»?

Дайте мне знать, если вам нужно увидеть больше кода. Спасибо.

1

Решение

Видите, это проблема с Microsoft, дающей имена типов указателей, которые не похожи на указатели.

LОнг пмешать TCHAR улИНГ (источник)

Ваш LPTSTR на самом деле не содержать строка; как char* (или же wchar_t*) это просто указывает на один. Вы можете поиграть с указателем времени жизни, сколько захотите, но с фактическими данными это никак не повлияет. Конечно, динамическое размещение указателя (пока изобретательская попытка) не поможет.

Почему бы не использовать правильную технологию C ++, такую ​​как std::string (или же std::wstring) вместо? Тогда вам будет сделано три минуты, а не три дня. 🙂

если ты действительно застряли с LPTSTRs, затем используйте функцию Windows API, предназначенную для копирования данных в другую: StringCchCopy.

2

Другие решения


По вопросам рекламы [email protected]