Fix Windows platform compilation errors - Unicode API calls and string encoding#12
Fix Windows platform compilation errors - Unicode API calls and string encoding#12
Conversation
Co-authored-by: lijy91 <3889523+lijy91@users.noreply.github.com>
… strdup Co-authored-by: lijy91 <3889523+lijy91@users.noreply.github.com>
lijy91
left a comment
There was a problem hiding this comment.
D:\a\libnativeapi\libnativeapi\src\platform\windows\keyboard_monitor_windows.cpp(32,30): error C2248: 'nativeapi::KeyboardMonitor::Impl': cannot access private class declared in class 'nativeapi::KeyboardMonitor' [D:\a\libnativeapi\libnativeapi\build\src\libnativeapi.vcxproj]
D:\a\libnativeapi\libnativeapi\src\platform\windows\keyboard_monitor_windows.cpp(9,24):
see declaration of 'nativeapi::KeyboardMonitor::Impl'
D:\a\libnativeapi\libnativeapi\src\keyboard_monitor.h(45,7):
see declaration of 'nativeapi::KeyboardMonitor'
D:\a\libnativeapi\libnativeapi\src\platform\windows\keyboard_monitor_windows.cpp(36,42): error C2248: 'nativeapi::KeyboardMonitor::Impl': cannot access private class declared in class 'nativeapi::KeyboardMonitor' [D:\a\libnativeapi\libnativeapi\build\src\libnativeapi.vcxproj]
D:\a\libnativeapi\libnativeapi\src\platform\windows\keyboard_monitor_windows.cpp(9,24):
see declaration of 'nativeapi::KeyboardMonitor::Impl'
D:\a\libnativeapi\libnativeapi\src\keyboard_monitor.h(45,7):
see declaration of 'nativeapi::KeyboardMonitor'
D:\a\libnativeapi\libnativeapi\src\platform\windows\menu_windows.cpp(137,8): warning C4311: 'reinterpret_cast': pointer truncation from 'HMENU' to 'nativeapi::MenuID' [D:\a\libnativeapi\libnativeapi\build\src\libnativeapi.vcxproj]
D:\a\libnativeapi\libnativeapi\src\platform\windows\menu_windows.cpp(137,8): warning C4302: 'reinterpret_cast': truncation from 'HMENU' to 'nativeapi::MenuID' [D:\a\libnativeapi\libnativeapi\build\src\libnativeapi.vcxproj]
tray_manager_windows.cpp
tray_windows.cpp
window_manager_windows.cpp
D:\a\libnativeapi\libnativeapi\src\platform\windows\window_manager_windows.cpp(25,17): warning C4312: 'reinterpret_cast': conversion from 'nativeapi::WindowID' to 'HWND' of greater size [D:\a\libnativeapi\libnativeapi\build\src\libnativeapi.vcxproj]
D:\a\libnativeapi\libnativeapi\src\platform\windows\window_manager_windows.cpp(62,29): warning C4311: 'reinterpret_cast': pointer truncation from 'HWND' to 'nativeapi::WindowID' [D:\a\libnativeapi\libnativeapi\build\src\libnativeapi.vcxproj]
D:\a\libnativeapi\libnativeapi\src\platform\windows\window_manager_windows.cpp(62,29): warning C4302: 'reinterpret_cast': truncation from 'HWND' to 'nativeapi::WindowID' [D:\a\libnativeapi\libnativeapi\build\src\libnativeapi.vcxproj]
D:\a\libnativeapi\libnativeapi\src\platform\windows\window_manager_windows.cpp(82,29): warning C4311: 'reinterpret_cast': pointer truncation from 'HWND' to 'nativeapi::WindowID' [D:\a\libnativeapi\libnativeapi\build\src\libnativeapi.vcxproj]
D:\a\libnativeapi\libnativeapi\src\platform\windows\window_manager_windows.cpp(82,29): warning C4302: 'reinterpret_cast': truncation from 'HWND' to 'nativeapi::WindowID' [D:\a\libnativeapi\libnativeapi\build\src\libnativeapi.vcxproj]
window_windows.cpp
D:\a\libnativeapi\libnativeapi\src\platform\windows\window_windows.cpp(46,10): warning C4311: 'reinterpret_cast': pointer truncation from 'HWND' to 'nativeapi::WindowID' [D:\a\libnativeapi\libnativeapi\build\src\libnativeapi.vcxproj]
D:\a\libnativeapi\libnativeapi\src\platform\windows\window_windows.cpp(46,10): warning C4302: 'reinterpret_cast': truncation from 'HWND' to 'nativeapi::WindowID' [D:\a\libnativeapi\libnativeapi\build\src\libnativeapi.vcxproj]
accessibility_manager_c.cpp
display_manager_c.cpp
D:\a\libnativeapi\libnativeapi\src\capi\display_manager_c.cpp(81,31): warning C4267: '=': conversion from 'size_t' to 'long', possible loss of data [D:\a\libnativeapi\libnativeapi\build\src\libnativeapi.vcxproj]
keyboard_monitor_c.cpp
Generating Code...
This PR fixes critical compilation errors preventing the Windows build from succeeding. The errors were primarily caused by mixing ANSI (narrow) and Unicode (wide) string types when calling Windows APIs.
Root Cause
The Windows platform implementation was inconsistently using ANSI versions of Windows APIs (like
LoadLibrary,CreateWindow,GetWindowText) while passing wide string literals and Unicode string types. This created compilation errors due to type mismatches betweenLPCSTRandconst wchar_t*.Key Changes
1. Consistent Unicode API Usage
Converted all Windows API calls to use Unicode (W) versions:
LoadLibrary→LoadLibraryWCreateWindow→CreateWindowWRegisterClass→RegisterClassWGetWindowText→GetWindowTextWSetWindowText→SetWindowTextWLoadImage→LoadImageWFindWindow→FindWindowWShell_NotifyIcon→Shell_NotifyIconW2. Structure Type Corrections
Updated Windows structures to use Unicode variants:
MENUITEMINFO→MENUITEMINFOWNOTIFYICONDATA→NOTIFYICONDATAWWNDCLASS→WNDCLASSW3. String Conversion Fixes
Fixed string type mismatches in
display_manager_windows.cppwhereCHARarrays were incorrectly being converted tostd::wstring. Now correctly converts tostd::stringfor narrow character device names.4. Missing Constants and Access Issues
SM_SCREENREADERconstant definition for older Windows SDK versionsKeyboardMonitor::Implprivate class access by adding friend declarationwindow_windows.cpp5. Platform-Specific Compatibility
_strdupinstead of deprecatedstrdupon Windows to eliminate warningswcscpy_sandwcsncpy_sImpact
These changes resolve all Windows compilation errors identified in the failed GitHub Actions build, enabling successful compilation on Windows platforms while maintaining compatibility with the existing codebase structure.
The fixes ensure consistent Unicode support throughout the Windows platform implementation, which is the recommended approach for modern Windows development and provides better internationalization support.
💡 You can make Copilot smarter by setting up custom instructions, customizing its development environment and configuring Model Context Protocol (MCP) servers. Learn more Copilot coding agent tips in the docs.