Re: Bugs in LONG_PTR usage in VS2005 header files
On Fri, 22 Jun 2007 16:51:03 -0400, Joseph M. Newcomer
<newcomer@flounder.com> wrote:
Just in case you encounter these, they appear to be actual bugs. The warnings should not
be issued. I'm using VS2005/SP1/Vista and compiling for Win32.
==================================================================================================================
FARPROC func;
line 43: ::SetWindowLongPtr(hWnd, GWLP_WNDPROC, (LONG_PTR)func);
warning C4244: 'argument' : conversion from 'LONG_PTR' to 'LONG', possible loss of data
i:\XXX\hook\hook.cpp 43
static LRESULT CALLBACK SubclassHandler(HWND, UINT, WPARAM, LPARAM);
line 289 ::SetWindowLongPtr(hWnd, GWLP_WNDPROC, (LONG_PTR)SubclassHandler);
warning C4244: 'argument' : conversion from 'LONG_PTR' to 'LONG', possible loss of data
i:\XXX\hook\hook.cpp 289
Given the definitions are
WINUSERAPI LONG_PTR WINAPI SetWindowLongPtrA(__in HWND hWnd, __in int nIndex, __in
LONG_PTR dwNewLong);
WINUSERAPI LONG_PTR WINAPI SetWindowLongPtrW(__in HWND hWnd, __in int nIndex, __in
LONG_PTR dwNewLong);
Do you see a conversion from LONG_PTR to LONG? I sure don't.
===================================================================================================================
Then there's
line 288 ::SetProp(hWnd, WNDPROC_PROP, (HANDLE)::GetWindowLongPtr(hWnd,
GWLP_WNDPROC));
warning C4312: 'type cast' : conversion from 'LONG' to 'HANDLE' of greater size
i:\XXX\hook\hook.cpp 288
WINUSERAPI LONG_PTR WINAPI GetWindowLongPtrA(__in HWND hWnd, __in int nIndex);
WINUSERAPI LONG_PTR WINAPI GetWindowLongPtrW(__in HWND hWnd, __in int nIndex);
Note also that this function returns a LONG_PTR, so casting a LONG_PTR to a HANDLE does
not change the type width...
===================================================================================================================
Sometimes using the /Wp64 option with /W4 causes the compiler to utter
inane warnings. For example:
#include <windows.h>
void g();
void f()
{
::SetWindowLongPtr(0, GWLP_WNDPROC, (LONG_PTR) g);
}
X>cl -c -Wp64 -W4 a.cpp
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 14.00.50727.762 for
80x86
Copyright (C) Microsoft Corporation. All rights reserved.
a.cpp
a.cpp(7) : warning C4244: 'argument' : conversion from 'LONG_PTR' to
'LONG', possible loss of data
It's the combination that's deadly; just one or the other doesn't produce
the warning.
Also, does anyone have a clue as to why [SG]etWindowLongPtr has -A and -W versions, given
there is no textual fields in the GetWindowLongPtr area?
joe
Maybe it has something to do with GWLP_WNDPROC?
--
Doug Harrison
Visual C++ MVP