tags:

views:

1182

answers:

5

WinAPI OpenFile function returns HFILE, and GetFileTime for instance needs HANDLE. When I feed it with (HANDLE)some_hFile it seems to work fine. Is there any difference in this types, or one of these is simply rudimental?

+4  A: 

OpenFile is a 16-bit Windows backward-compatibility function. CreateFile is the function to open files.

Barry Kelly
+4  A: 

If the function succeeds then HFILE is a file HANDLE. If not, then it is an HFILE_ERROR constant (presumably -1). The point is that it can't be a HANDLE on error so they return something that can be either a HANDLE or an error value.

See @Barry's suggestion as well.

tvanfosson
+1  A: 

The OpenFile returns a File Handle if succed or a HFILE_ERROR if it fails.

Stefan
+2  A: 

To answer your question, HANDLE is just an unsigned 32bit number defined as PVOID. It is a generic handle. HFILE is a specialized handle, although defined as signed 32bit number to be able to get value -1.
There are other specialized handles, like HACCEL, HBITMAP, HINSTANCE, etc., all defined as a dependence to HANDLE.

PhiLho
+1  A: 

Years ago, HANDLES were 16-bit ints. All handles everywhere in Windows were HANDLES. Then someone realized that a file HANDLE wasn't quite the same thing as a window HANDLE, and if they were defined differently, say as HFILE and HWND, then maybe developers wouldn't accidentally interchange them as much. (However they were both typedef'ed to int).

Later still, someone realized that if they were defined completely defferently...say as:

typedef struct _hfile {} * HFILE;
typedef struct _hwnd {} * HWND;

then the compiler itself would complain if you used one in place of the other, even if, in reality, each was just a plain old 16-bit (eventually 32-bit) int value.

James Curran