Skip to content

The User32 import libray for 32 bit must be updated #446

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
JoseRoca opened this issue Mar 25, 2025 · 2 comments
Open

The User32 import libray for 32 bit must be updated #446

JoseRoca opened this issue Mar 25, 2025 · 2 comments

Comments

@JoseRoca
Copy link

JoseRoca commented Mar 25, 2025

The linker reports undefined reference when trying to use this code with the 32-bit compiler. They work (the ones tested, at least) with the 64-bit compiler.

enum DPI_AWARENESS
  DPI_AWARENESS_INVALID = -1
  DPI_AWARENESS_UNAWARE = 0
  DPI_AWARENESS_SYSTEM_AWARE = 1
  DPI_AWARENESS_PER_MONITOR_AWARE = 2
end enum

'#define DECLARE_HANDLE(name) type name##__ : as int unused : end type : type name as name##__ ptr
#define DPI_AWARENESS_CONTEXT HANDLE
'#define DPI_AWARENESS_CONTEXT_UNAWARE              ((DPI_AWARENESS_CONTEXT)-1)
'#define DPI_AWARENESS_CONTEXT_SYSTEM_AWARE         ((DPI_AWARENESS_CONTEXT)-2)
'#define DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE    ((DPI_AWARENESS_CONTEXT)-3)
'#define DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2 ((DPI_AWARENESS_CONTEXT)-4)
'#define DPI_AWARENESS_CONTEXT_UNAWARE_GDISCALED    ((DPI_AWARENESS_CONTEXT)-5)

enum DPI_HOSTING_BEHAVIOR
  DPI_HOSTING_BEHAVIOR_INVALID = -1
  DPI_HOSTING_BEHAVIOR_DEFAULT = 0
  DPI_HOSTING_BEHAVIOR_MIXED = 1
end enum

enum DIALOG_CONTROL_DPI_CHANGE_BEHAVIORS
  DCDC_DEFAULT = &h0000
  DCDC_DISABLE_FONT_UPDATE = &h0001
  DCDC_DISABLE_RELAYOUT = &h0002
end enum

enum DIALOG_DPI_CHANGE_BEHAVIORS
  DDC_DEFAULT = &h0000
  DDC_DISABLE_ALL = &h0001
  DDC_DISABLE_RESIZE = &h0002
  DDC_DISABLE_CONTROL_RELAYOUT = &h0004
end enum

extern "Windows-MS"

   DECLARE FUNCTION AdjustWindowRectExForDpi (BYVAL lpRect AS RECT PTR, BYVAL dwStyle AS DWORD, BYVAL bMenu As WINBOOL, _
      BYVAL dwExStyle AS DWORD, BYVAL dpi AS UINT) AS WINBOOL
   DECLARE FUNCTION AreDpiAwarenessContextsEqual (BYVAL dpiContextA AS DPI_AWARENESS_CONTEXT, BYVAL dpiContextB AS DPI_AWARENESS_CONTEXT) AS WINBOOL
   DECLARE FUNCTION EnableNonClientDpiScaling (BYVAL hwnd AS HWND) AS WINBOOL
   DECLARE FUNCTION GetAwarenessFromDpiAwarenessContext(BYVAL value AS DPI_AWARENESS_CONTEXT) AS DPI_AWARENESS
   DECLARE FUNCTION GetDialogControlDpiChangeBehavior (BYVAL hwnd AS HWND) AS DIALOG_CONTROL_DPI_CHANGE_BEHAVIORS
   DECLARE FUNCTION GetDialogDpiChangeBehavior (BYVAL hDlg AS HWND) AS DIALOG_DPI_CHANGE_BEHAVIORS
   DECLARE FUNCTION GetDpiAwarenessContextForProcess (BYVAL hProcess AS HANDLE) AS DPI_AWARENESS_CONTEXT
   DECLARE FUNCTION GetDpiForSystem() AS UINT
   ' --- Works in 64-bit; undefined reference in 32-bit
   DECLARE FUNCTION GetDpiForWindow (BYVAL hwnd AS HWND) AS UINT
   ' --- Works in 64-bit; undefined reference in 32-bit
   DECLARE FUNCTION GetDpiFromDpiAwarenessContext (BYVAL value AS DPI_AWARENESS_CONTEXT) AS UINT
   DECLARE FUNCTION GetSystemDpiForProcess(BYVAL hProcess AS HANDLE) AS UINT
   DECLARE FUNCTION GetSystemMetricsForDpi (BYVAL nIndex AS int_, BYVAL dpi AS UINT) AS int_
   DECLARE FUNCTION GetThreadDpiAwarenessContext () AS DPI_AWARENESS_CONTEXT
   ' --- Works in 64-bit; undefined reference in 32-bit
   DECLARE FUNCTION GetThreadDpiHostingBehavior () AS DPI_HOSTING_BEHAVIOR
   DECLARE FUNCTION GetWindowDpiAwarenessContext (BYVAL hwnd AS HWND) AS DPI_AWARENESS_CONTEXT
   DECLARE FUNCTION InheritWindowMonitor (BYVAL hwnd AS HWND, BYVAL hwndInherit AS HWND) AS WINBOOL
   DECLARE FUNCTION IsValidDpiAwarenessContext (BYVAL value AS DPI_AWARENESS_CONTEXT) AS WINBOOL
   ' --- Works in 64-bit; undefined reference in 32-bit
   DECLARE FUNCTION LogicalToPhysicalPointForPerMonitorDPI (BYVAL hwnd AS HWND, BYVAL lpPoint AS LPPOINT) AS WINBOOL
   DECLARE FUNCTION PhysicalToLogicalPointForPerMonitorDPI (BYVAL hwnd AS HWND, BYVAL lpPoint AS LPPOINT) AS WINBOOL
   DECLARE FUNCTION SetDialogControlDpiChangeBehavior (BYVAL hwnd AS HWND, BYVAL mask AS DIALOG_CONTROL_DPI_CHANGE_BEHAVIORS, _
      BYVAL values AS DIALOG_CONTROL_DPI_CHANGE_BEHAVIORS) AS WINBOOL
   DECLARE FUNCTION SetProcessDpiAwarenessContext (BYVAL value AS DPI_AWARENESS_CONTEXT) AS WINBOOL
   DECLARE FUNCTION SetThreadCursorCreationScaling(BYVAL cursorDPI AS UINT) AS UINT
   DECLARE FUNCTION SetThreadDpiAwarenessContext (BYVAL dpiContext AS DPI_AWARENESS_CONTEXT) AS DPI_AWARENESS_CONTEXT
   DECLARE FUNCTION SetThreadDpiHostingBehavior (BYVAL value AS DPI_HOSTING_BEHAVIOR) AS DPI_HOSTING_BEHAVIOR
   DECLARE FUNCTION SystemParametersInfoForDpi (BYVAL uiAction AS UINT, BYVAL uiParam AS UINT, BYVAL pvParam AS PVOID, BYVAL fWinIni AS UINT, BYVAL dpi AS UINT) AS WINBOOL

end extern
@JoseRoca
Copy link
Author

JoseRoca commented Mar 25, 2025

If I load the functions dynamically, they work with 32-bit, e.g.

FUNCTION GetDpiForSystem () AS UINT
   DIM AS ANY PTR pLib = DyLibLoad("user32.dll")
   IF pLib = NULL THEN RETURN 0
   DIM pGetDpiForSystem AS FUNCTION () AS UINT
   pGetDpiForSystem = DyLibSymbol(pLib, "GetDpiForSystem")
   IF pGetDpiForSystem THEN FUNCTION = pGetDpiForSystem()
   DyLibFree(pLib)
END FUNCTION

@JoseRoca JoseRoca changed the title The C runtime import libray for 32 bit must be outdated The User32 import libray for 32 bit must be outdated Mar 25, 2025
@JoseRoca JoseRoca changed the title The User32 import libray for 32 bit must be outdated The User32 import libray for 32 bit must be updated Mar 25, 2025
@JoseRoca
Copy link
Author

Apparently there are more import files that need to be updated, such shcore.dll. Without updated import files we can't use the newest Windows APIs, unless we load them dynamically and write wrappers to use them, which is a pain in the ...

User32.dll has 25 functions related with High DPI, and shcore.dll three. There are also several enumerations to use them that should be included in the .bi files.

These functions are very important to Windows programmers to develop DPI aware applications.

Functions and enumerations in User32.dll:

DECLARE FUNCTION AdjustWindowRectExForDpi (BYVAL lpRect AS RECT PTR, BYVAL dwStyle AS DWORD, BYVAL bMenu As WINBOOL, _
   BYVAL dwExStyle AS DWORD, BYVAL dpi AS UINT) AS WINBOOL
DECLARE FUNCTION AreDpiAwarenessContextsEqual (BYVAL dpiContextA AS DPI_AWARENESS_CONTEXT, BYVAL dpiContextB AS DPI_AWARENESS_CONTEXT) AS WINBOOL
DECLARE FUNCTION EnableNonClientDpiScaling (BYVAL hwnd AS HWND) AS WINBOOL
DECLARE FUNCTION GetAwarenessFromDpiAwarenessContext(BYVAL value AS DPI_AWARENESS_CONTEXT) AS DPI_AWARENESS
DECLARE FUNCTION GetDialogControlDpiChangeBehavior (BYVAL hwnd AS HWND) AS DIALOG_CONTROL_DPI_CHANGE_BEHAVIORS
DECLARE FUNCTION GetDialogDpiChangeBehavior (BYVAL hDlg AS HWND) AS DIALOG_DPI_CHANGE_BEHAVIORS
DECLARE FUNCTION GetDpiAwarenessContextForProcess (BYVAL hProcess AS HANDLE) AS DPI_AWARENESS_CONTEXT
DECLARE FUNCTION GetDpiForSystem() AS UINT
DECLARE FUNCTION GetDpiForWindow (BYVAL hwnd AS HWND) AS UINT
DECLARE FUNCTION GetDpiFromDpiAwarenessContext (BYVAL value AS DPI_AWARENESS_CONTEXT) AS UINT
DECLARE FUNCTION GetSystemDpiForProcess(BYVAL hProcess AS HANDLE) AS UINT
DECLARE FUNCTION GetSystemMetricsForDpi (BYVAL nIndex AS int_, BYVAL dpi AS UINT) AS int_
DECLARE FUNCTION GetThreadDpiAwarenessContext () AS DPI_AWARENESS_CONTEXT
DECLARE FUNCTION GetThreadDpiHostingBehavior () AS DPI_HOSTING_BEHAVIOR
DECLARE FUNCTION GetWindowDpiAwarenessContext (BYVAL hwnd AS HWND) AS DPI_AWARENESS_CONTEXT
DECLARE FUNCTION InheritWindowMonitor (BYVAL hwnd AS HWND, BYVAL hwndInherit AS HWND) AS WINBOOL
DECLARE FUNCTION IsValidDpiAwarenessContext (BYVAL value AS DPI_AWARENESS_CONTEXT) AS WINBOOL
DECLARE FUNCTION LogicalToPhysicalPointForPerMonitorDPI (BYVAL hwnd AS HWND, BYVAL lpPoint AS LPPOINT) AS WINBOOL
DECLARE FUNCTION PhysicalToLogicalPointForPerMonitorDPI (BYVAL hwnd AS HWND, BYVAL lpPoint AS LPPOINT) AS WINBOOL
DECLARE FUNCTION SetDialogControlDpiChangeBehavior (BYVAL hwnd AS HWND, BYVAL mask AS DIALOG_CONTROL_DPI_CHANGE_BEHAVIORS, _
   BYVAL values AS DIALOG_CONTROL_DPI_CHANGE_BEHAVIORS) AS WINBOOL
DECLARE FUNCTION SetProcessDpiAwarenessContext (BYVAL value AS DPI_AWARENESS_CONTEXT) AS WINBOOL
DECLARE FUNCTION SetThreadCursorCreationScaling(BYVAL cursorDPI AS UINT) AS UINT
DECLARE FUNCTION SetThreadDpiAwarenessContext (BYVAL dpiContext AS DPI_AWARENESS_CONTEXT) AS DPI_AWARENESS_CONTEXT
DECLARE FUNCTION SetThreadDpiHostingBehavior (BYVAL value AS DPI_HOSTING_BEHAVIOR) AS DPI_HOSTING_BEHAVIOR
DECLARE FUNCTION SystemParametersInfoForDpi (BYVAL uiAction AS UINT, BYVAL uiParam AS UINT, BYVAL pvParam AS PVOID, BYVAL fWinIni AS UINT, BYVAL dpi AS UINT) AS WINBOOL

enum DPI_AWARENESS
  DPI_AWARENESS_INVALID = -1
  DPI_AWARENESS_UNAWARE = 0
  DPI_AWARENESS_SYSTEM_AWARE = 1
  DPI_AWARENESS_PER_MONITOR_AWARE = 2
end enum

#define DPI_AWARENESS_CONTEXT HANDLE
#define DPI_AWARENESS_CONTEXT_UNAWARE              (CAST(DPI_AWARENESS_CONTEXT,-1))
#define DPI_AWARENESS_CONTEXT_SYSTEM_AWARE         (CAST(DPI_AWARENESS_CONTEXT,-2))
#define DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE    (CAST(DPI_AWARENESS_CONTEXT,-3))
#define DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2 (CAST(DPI_AWARENESS_CONTEXT,-4))
#define DPI_AWARENESS_CONTEXT_UNAWARE_GDISCALED    (CAST(DPI_AWARENESS_CONTEXT,-5))

enum DPI_HOSTING_BEHAVIOR
  DPI_HOSTING_BEHAVIOR_INVALID = -1
  DPI_HOSTING_BEHAVIOR_DEFAULT = 0
  DPI_HOSTING_BEHAVIOR_MIXED = 1
end enum

enum DIALOG_CONTROL_DPI_CHANGE_BEHAVIORS
  DCDC_DEFAULT = &h0000
  DCDC_DISABLE_FONT_UPDATE = &h0001
  DCDC_DISABLE_RELAYOUT = &h0002
end enum

enum DIALOG_DPI_CHANGE_BEHAVIORS
  DDC_DEFAULT = &h0000
  DDC_DISABLE_ALL = &h0001
  DDC_DISABLE_RESIZE = &h0002
  DDC_DISABLE_CONTROL_RELAYOUT = &h0004
end enum

Functions and enums in shcore.dll:

DEClARE FUNCTION GetProcessDpiAwareness(BYAL hprocess AS HANDLE, BYVAL value AS PROCESS_DPI_AWARENESS PTR) AS HRE>SULT
DECLARE FUNCTION SetProcessDpiAwareness(BYVAL value As PROCESS_DPI_AWARENESS) AS HRESULT
DECLARE FUNCTION GetDpiForMonitor(BYVAL hmonitor AS HMONITOR, BYVAL dpiType AS MONITOR_DPI_TYPE, BYVAL dpiX AS UINT PTR, BYVAL dpiY AS UINT PTR) AS HRESULT

enum PROCESS_DPI_AWARENESS
  PROCESS_DPI_UNAWARE = 0
  PROCESS_SYSTEM_DPI_AWARE = 1
  PROCESS_PER_MONITOR_DPI_AWARE = 2
end enum

enum MONITOR_DPI_TYPE
  MDT_EFFECTIVE_DPI = 0
  MDT_ANGULAR_DPI = 1
  MDT_RAW_DPI = 2
  MDT_DEFAULT
end enum

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant