Код
::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 - согласен. Пофиксил. Спасибо, что заметил.
> Это же "хвост" с 16 разрядных времен. Если прога компилится > под win32 - забей на это.
LONG всю жизнь был 32-битным, а потом оказалось, что указатели в LONG уже не влазят - ввели LONG_PTR - 32-битный на 32-битной машине и 64-битный на 64-битной
А, ну да, точно! Просто, в аналогичнй ситуяйции с 16/32 возникали аналогичные варнинги. Все равно - можно забить.08.07.07 08:21 Автор: Zef <Alloo Zef> Статус: Elderman