2015-05-28 2 views
1

EDIT: Решение должно было заменить LPTSTR на wstring. Когда Windows API требуется LPTSTR wstring отливают с .c_str()LPTSTR Losing Scope, работа вокруг не работает (C++)

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

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

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

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

Я пытаюсь сделать работу, но через 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, значения не были назначены. Возможно, я ошибочно использовал «нового» оператора?

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

ответ

2

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

л Ong р ointer к Т СИМ ул Инг (source)

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

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

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

+0

Я хотел бы сделать это, но когда я загружу свое изображение с помощью вызова LoadImage(), вызов функции примет только LPTSTR. Iv попытался сохранить как wstring, а затем преобразовать его, но все это ни к чему. https://msdn.microsoft.com/en-us/library/windows/desktop/ms648045%28v=vs.85%29.aspx –

+0

@ChrisEst: прочитайте окончательное предложение. Однако вы должны были бы передать 'myWstring.c_str()' в 'LoadImage()'. –

+0

Я постараюсь заменить LPTSTR на wstring, я сомневаюсь, что он будет работать с LoadImage(), но это стоит того. –

Смежные вопросы