Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Записать значение в low-order word of LPCTSTR ?


Автор: WinDev 8.9.2011, 08:55
Есть переменная типа LPCTSTR. Как записать нужное значение в младшее слово?

Автор: Cheloveck 8.9.2011, 09:20
Код

LPCTSTR var = (LPCTSTR)100;

Я понимаю, если бы проблема была со старшим...

Автор: mes 8.9.2011, 09:30
Цитата(Cheloveck @  8.9.2011,  08:20 Найти цитируемый пост)
Я понимаю, если бы проблема была со старшим... 


Цитата(Cheloveck @  8.9.2011,  08:20 Найти цитируемый пост)
Код

LPCTSTR var = (LPCTSTR)100

Я понимаю, если бы проблема была со старшим... 



Cheloveck, а с таким подходом старшее не затрется ?

Автор: newbee 8.9.2011, 09:31
Цитата(Cheloveck @  8.9.2011,  10:20 Найти цитируемый пост)
LPCTSTR var = (LPCTSTR)100;

LPCSTR - это ж char const*, нет? Зачем в него числа записывать?

Автор: bsa 8.9.2011, 10:39
Цитата(newbee @  8.9.2011,  09:31 Найти цитируемый пост)
LPCSTR - это ж char const*, нет?

не совсем. это скорее какой-нибудь const TCHAR *. Который в юникоде эквивалентен const wchar_t *, а в неюникоде - const char *.

Автор: Cheloveck 8.9.2011, 14:07
Цитата(mes @  8.9.2011,  09:30 Найти цитируемый пост)
Cheloveck, а с таким подходом старшее не затрется ? 

Затрётся. В вопросе этого не было.

Автор: borisbn 8.9.2011, 14:22
Цитата(bsa @  8.9.2011,  10:39 Найти цитируемый пост)
не совсем. это скорее какой-нибудь const TCHAR *. Который в юникоде эквивалентен const wchar_t *, а в неюникоде - const char *

нет. const TCHAR * - это LPCTSTR, а 
Цитата(newbee @  8.9.2011,  09:31 Найти цитируемый пост)
LPCSTR - это ж char const*


Автор: newbee 8.9.2011, 14:32
borisbn, я опечаталась. В этих типах не мудрено smile Но вопрос остается в силе, зачем (может понадобиться) вручную модифицировать указатель?

Автор: borisbn 8.9.2011, 14:39
newbee, ага. только сейчас обратил внимание. Но для вопроса ТС что char *, что wchar_t * (да хоть void *) - это не важно. Всё это указатель (4 байта на 32-х битной системе).
А вот зачем в него (вернее в его младшую часть) что-то писать - вопрос  smile 

Автор: mes 8.9.2011, 15:14
Цитата(Cheloveck @  8.9.2011,  13:07 Найти цитируемый пост)
Затрётся. В вопросе этого не было. 

было явно сказано, что нужно записать в младшее слово.. а не изменить целиком значение.. а это разные вещи..

Автор: bsa 8.9.2011, 15:40
Цитата(WinDev @  8.9.2011,  08:55 Найти цитируемый пост)
Как записать нужное значение в младшее слово? 

Код
LPCTSTR p;
...
p = (LPCTSTR)(((DWORD)p & 0xffff0000) | x); //x - значение, которое необходимо записать в младшее слово

данный жестко привязан к одной платформе (win32, на win64 работать НЕ БУДЕТ).

Автор: maydjin 8.9.2011, 18:21
Цитата

данный жестко привязан к одной платформе (win32, на win64 работать НЕ БУДЕТ).

А разве на 64 битных платформах размер слова другой ?

Автор: bems 8.9.2011, 19:43
Код

    LPCTSTR p;
    *((PUSHORT)&p) = x;

на машинах с прямым порядком байт работать не будет smile 

Автор: bems 8.9.2011, 20:10
Цитата(borisbn @  8.9.2011,  14:39 Найти цитируемый пост)
А вот зачем в него (вернее в его младшую часть) что-то писать - вопрос
Ну например гранулярность выделения памяти в виндах - 64к. Соответственно изменяя младшее слово можно гарантированно остаться в том же регионе.

Автор: bsa 8.9.2011, 21:55
Цитата(maydjin @  8.9.2011,  18:21 Найти цитируемый пост)
А разве на 64 битных платформах размер слова другой ?

Размер слова тот же, но вот размер указателя другой. И он не влезает в DWORD.

Автор: volatile 9.9.2011, 01:42
До кучи
Код

   LPCTSTR p;
   ...
   p = (LPCTSTR)((((ULONG_PTR)p >> 16) << 16) | (WORD)x); //x - значение, которое необходимо записать в младшее 16-разр. слово

Должна работать как на 32, так и на 64 битных платформах.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)