Home > Blockchain >  Why do I get incompatible pointer type?
Why do I get incompatible pointer type?

Time:09-13

I am trying to use GetVersionEx() from the Windows API with the OSVERSIONINFOEX structure, but this keeps throwing a warning about an incompatible pointer type:

OSVERSIONINFOEX osInfo;
osInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
GetVersionEx(&osInfo);
printf("%ld\n", osInfo.dwBuildNumber);

full warning:

id.c:31:18: warning: passing argument 1 of 'GetVersionExA' from incompatible pointer type [-Wincompatible-pointer-types]
   31 |     GetVersionEx(&osInfo);
      |                  ^~~~~~~~
      |                  |
      |                  OSVERSIONINFOEX * {aka OSVERSIONINFOEXA *}
In file included from C:/msys64/mingw64/include/winbase.h:36,
                 from C:/msys64/mingw64/include/windows.h:70,
                 from id.c:1:
C:/msys64/mingw64/include/sysinfoapi.h:64:61: note: expected 'LPOSVERSIONINFOA' {aka 'struct _OSVERSIONINFOA *'} but argument is of type 'OSVERSIONINFOEX *' {aka 'OSVERSIONINFOEXA *'}
   64 |   WINBASEAPI WINBOOL WINAPI GetVersionExA (LPOSVERSIONINFOA lpVersionInformation);
      |                                            ~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~

CodePudding user response:

GetVersionEx() expects an OSVERSIONINFO* pointer, not an OSVERSIONINFOEX* pointer. However, the OSVERSIONINFO* pointer can point at an OSVERSIONINFOEX instance, so you just need to use a typecast, eg:

GetVersionEx((LPOSVERSIONINFO)&osInfo);
  • Related