HMG 64-bits Documentation

Since version HMG.3.3.0 (2014\/04\/24) HMG builds applications in 32 and 64 bits depending if the choice of compilation is with build.bat or build64.bat respectively. When you compile with the IDE select the option “Build” in main menu.

Guidelines to make compatible code with Win32\/64-bits

# PRG level: at high level is not necessary any changes in your code, all Harbour functions are portables to 64-bits.

# C level: at low level are necessary some changes in your code because HMG stores pointers in integer numbers and the size of the pointers change with the architecture (32 or 64 bits), the other hand some functions of Windows that use HMG are not portables.

a) Values that can take 32 or 64 bits

HMG use many pointers and numbers type, and the size of the pointers and some these data types are of 32 or 64 bits according to the architecture chosen for compiling, for example:

  • All Pointers: all GDI handles (HANDLE, HBITMAP, HBRUSH, HCURSOR, HDC, HENHMETAFILE, HFONT, HGDIOBJ, HGLOBAL, HICON, HINSTANCE, HKEY, HMENU, HMODULE, HPEN, HRGN, HWND, etc.), void*, int*, NULL, PVOID, LPVOID, PINT, LPINT, etc.

  • Some data types such as: WPARAM, LPARAM, LRESULT, LONG_PTR, LONG_INT, size_t, time_t, etc.

b) Deprecated (obsolete) functions

Some API-functions are not portable to 64-bits and are considered obsolete such as SetWindowLong, GetWindowLong, SetClassLong, GetClassLong, etc. If you need these functions in your code, use the new equivalent functions (this list is not exhaustive): SetWindowLongPtr, GetWindowLongPtr, SetClassLongPtr, GetClassLongPtr, etc.

c) Create portable code

For example, in 32-bits is created a high level version of the function SendMessage() as:

HB_FUNC ( SENDMESSAGE )
{
   HWND hWnd = (HWND) hb_parnl (1);
   UINT Msg = (UINT) hb_parnl (2);
   WPARAM wParam = (WPARAM) hb_parnl (3);
   LPARAM lParam = (LPARAM) hb_parnl (4);
   LRESULT ret;
   ret = SendMessage (hWnd, Msg, wParam, lParam);
   hb_retnl ((LONG) ret);
}

But this code is not portable to 64-bits because:

1) HWND, WPARAM and LPARAM are 64-bit values and is assigned 32-bit values with hb_parnl()

2) is returned a LONG number (32-bit value) whereas LRESULT is a 64-bit value

If you desire write portable codes in HMG you must write as:

HB_FUNC ( SENDMESSAGE )
{
   HWND hWnd = (HWND) HMG_parnl (1);
   UINT Msg = (UINT) hb_parnl (2);
   WPARAM wParam = (WPARAM) HMG_parnl (3);
   LPARAM lParam = (LPARAM) HMG_parnl (4);
   LRESULT ret;
   ret = SendMessage (hWnd, Msg, wParam, lParam);
   HMG_retnl ((LONG_PTR) ret);
}

HMG_parnl, HMG_retnl and LONG_PTR take a 32 or 64 bit value according to the chosen architecture.

HMG defines a series of macros (INCLUDE\HMG_UNICODE.h) that take a value of 32 or 64 bit according to the architecture chosen for compiling:

- HMG_parnl

- HMG_parvnl

- HMG_retnl

- HMG_retnllen

- HMG_stornl

- HMG_storvnl

- HMG_arraySetNL

- HMG_arrayGetNL

Note: remember when you pass a value to these functions you should use LONG_PTR or INT_PTR for type conversion instead of LONG or INT. When the parameters or values returned are of 32-bits you continue using hb_parnl, hb_parni, hb_retnl, hb_retni, etc. and continue the conversion of type with LONG or INT as usually.

WIN32 WIN64
char 8 8
short 16 16
int 32 32
long 32 32
long long 64 64
size_t 32 64
pointer 32 64
Others(*) 32 64
(*) LONG_PTR, INT_PTR, WPARAM, LPARAM, LRESULT, etc.

results matching ""

    No results matching ""