РЕДАКТИРОВАТЬ: Решение было заменить 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»?
Дайте мне знать, если вам нужно увидеть больше кода. Спасибо.
Видите, это проблема с Microsoft, дающей имена типов указателей, которые не похожи на указатели.
LОнг пмешать TCHAR улИНГ (источник)
Ваш LPTSTR
на самом деле не содержать строка; как char*
(или же wchar_t*
) это просто указывает на один. Вы можете поиграть с указателем времени жизни, сколько захотите, но с фактическими данными это никак не повлияет. Конечно, динамическое размещение указателя (пока изобретательская попытка) не поможет.
Почему бы не использовать правильную технологию C ++, такую как std::string
(или же std::wstring
) вместо? Тогда вам будет сделано три минуты, а не три дня. 🙂
если ты действительно застряли с LPTSTR
s, затем используйте функцию Windows API, предназначенную для копирования данных в другую: StringCchCopy
.