Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
 |  |
Наоборот, это хвост с 32-битных времен. 06.07.07 11:36 Число просмотров: 2616
Автор: amirul <Serge> Статус: The Elderman
|
> Это же "хвост" с 16 разрядных времен. Если прога компилится > под win32 - забей на это.
LONG всю жизнь был 32-битным, а потом оказалось, что указатели в LONG уже не влазят - ввели LONG_PTR - 32-битный на 32-битной машине и 64-битный на 64-битной
|
<programming>
|
[C++] warning при кастинге 06.07.07 03:29
Автор: void <Grebnev Valery> Статус: Elderman
|
Код
::SetWindowLongPtr( m_hWnd, GWL_USERDATA, reinterpret_cast<LONG_PTR>( this ));
приводит к : warning C4244: 'argument' : conversion from 'LONG_PTR' to 'LONG', possible loss of data
И обратно, код
CTabDialog* pdialog =reinterpret_cast<CTabDialog*>(GetWindowLongPtr(hwndDlg, GWL_USERDATA));
приводит к : warning C4312: 'reinterpret_cast' : conversion from 'LONG' to 'CTabDialog *' of greater size
Работать-то работает, но как исправить по-существу кастинг?
Использую VS 2005 Express .
Спасибо.
|
 |
[C++] Очень странно 06.07.07 11:45
Автор: amirul <Serge> Статус: The Elderman
|
> Код > ::SetWindowLongPtr( m_hWnd, GWL_USERDATA, > reinterpret_cast<LONG_PTR>( this )); > приводит к : warning C4244: 'argument' : conversion from > 'LONG_PTR' to 'LONG', possible loss of data
Во-первых под x64 этот код у тебя вообще не скомпилируется. Ну нету у него GWL_USERDATA, а есть GWLP_USERDATA
А во-вторых (и это странно), такое ощущение, что третий аргумент у тебя объявлен LONG-ом. Посмотри откуда у тебя инклудится winuser.h и посмотри в нем прототип SetWindowLongPtr. Ну еще глянь где объявляется typedef на LONG_PTR. Если лень продираться через все #ifdef-ы, то включи в пропертях проекта Configuration Properties->C/C++->Preprocessor->Generate Preprocessed File.
И после этого разбирайся какой typedef у тебя включен и почему.
> И обратно, код > CTabDialog* pdialog > =reinterpret_cast<CTabDialog*>(GetWindowLongPtr(hwndD > lg, GWL_USERDATA)); > приводит к : warning C4312: 'reinterpret_cast' : conversion > from 'LONG' to 'CTabDialog *' of greater size > > Работать-то работает, но как исправить по-существу кастинг? > > Использую VS 2005 Express . > Спасибо.
|
 |  |
У меня VS 2005 Express. По умолчанию была включена опция... 07.07.07 05:56
Автор: void <Grebnev Valery> Статус: Elderman
|
У меня VS 2005 Express. По умолчанию была включена опция "/Wp64 (Detect 64-Bit Portability Issues) ".
(это страно, т.к. в help-e указано, что по умолчанию эта опция должна быть выключена для Win32 apps).
Выключил эту опцию - warning-и то и пропали.
Что же касается, tydef-ов, то SetWindowLongPtr определён в <winuser.h> как
WINUSERAPI LONG WINAPI SetWindowLongW( __in HWND hWnd, __in int nIndex, __in LONG dwNewLong);
Чего и следовало быть для моего W32 компилера.
LONG_PTR SetWindowLongPtr( HWND hWnd, int nIndex, LONG_PTR dwNewLong); появляется только для _W64 (что логично)
Таким образом это всё предполагает, что код должен компилироваться нормально для w64. Надеюсь.
Про GWLP_USERDATA - согласен. Пофиксил. Спасибо, что заметил.
|
 |
[C++] Зачем исправлять? 06.07.07 03:54
Автор: Zef <Alloo Zef> Статус: Elderman
|
Это же "хвост" с 16 разрядных времен. Если прога компилится под win32 - забей на это.
|
 |  |
Наоборот, это хвост с 32-битных времен. 06.07.07 11:36
Автор: amirul <Serge> Статус: The Elderman
|
> Это же "хвост" с 16 разрядных времен. Если прога компилится > под win32 - забей на это.
LONG всю жизнь был 32-битным, а потом оказалось, что указатели в LONG уже не влазят - ввели LONG_PTR - 32-битный на 32-битной машине и 64-битный на 64-битной
|
 |  |  |
А, ну да, точно! Просто, в аналогичнй ситуяйции с 16/32 возникали аналогичные варнинги. Все равно - можно забить. 08.07.07 08:21
Автор: Zef <Alloo Zef> Статус: Elderman
|
|
|
|