If you are a programmer who studied C/C++ after Windows 95, you may not know the existence of windows data types like INT_PTR, LONG_PTR, because you don’t really need to use it.
So, when you have a chance to port legacy codes to x64 platform, you may fail in considering proper porting of variables declared with those or variables which don’t use them but semantically means the same.
At StackOverFlow, there is good explanation on this subject.
However, I would like to add more comment.
During MS DOS era, many programmers wrote codes in a way that the longest data type available on his/her machine to store addresses or pointer values. There were a little reason for that. For example, you want to do somewhat mathematical calculation with addresses without bordering with the width of the data type.
To me, it has been always better to calculate on addresses with the width of data type in mind, but there are some other cases you should have disregard the width of data type and just calculate something. It was kind of high technique for doing something weird. ( Some can be, while others are not. )
Some Windows API functions and member functions still require to use such convention. They ask you to pass address value to a variable which is not pointer variables. For that purpose, they use *_PTR.
So, I noticed that not a few programmers, who don’t know history, tended to fail in porting legacy code to x64.
Also, there is opposite example.
This time, it is to store non-pointer value to a pointer variable. Such an example is MAKEINTRESOURCE() macro.
So, it takes an integer number for a resource like resource ID for a bitmap or an icon, and converts it to pointer to string (LPTSTR).
So, if you are one of new guys who don’t know its history, just get familiar with this and don’t be puzzled!