[Win32utils-devel] Modification for mkmf

win32utils-devel at rubyforge.org win32utils-devel at rubyforge.org
Fri Dec 10 11:08:25 EST 2004


Hi all,

I came across this page today:

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winprog
/winprog/using_the_windows_headers.asp

Based on that, I think we need a patch for mkmf when on Windows that
sets _WIN32_WINNT automatically based on platform.  This is the basic
code I've come up with:

require "mkmf"
require "win32ole"
require "socket"

# We need to get the exact version number and set _WIN32_WINNT
accordingly
host = Socket.gethostname

cs =
"winmgmts:{impersonationLevel=impersonate,(security)}//#{host}/root/cimv
2"
wmi = WIN32OLE.connect(cs)

major    = nil
minor    = nil

wmi.InstancesOf("Win32_OperatingSystem").each{ |ole|
   major, minor = ole.Version.split(".").map{ |e| e.to_i }
   break
}

win32_winnt = nil

# The value for Windows NT 4 and Windows 95 are the same.
# The value for Windows 2000 and Windows ME are the same.
case major
   when 5
      case minor
         when 2   # 2003
            win32_winnt = "0x0502"
         when 1   # XP
            win32_winnt = "0x0501"
         else     # 2000
            win32_winnt = "0x0500"
      end
   when 4
      case minor
         when 0   # NT or 95
            win32_winnt = "0x0400"
         when 90  # ME
            win32_winnt = "0x0500"
         when 10  # 98
            win32_winnt = "0x0410"
      end 
end

# So long as we're not on Windows 3.51 or earlier, this should be
defined
if win32_winnt
   $CPPFLAGS += " -D_WIN32_WINNT=#{win32_winnt}"
end

# END

I realize there are possible scenarios where this won't quite work (see
the example they discuss near the bottom of the link I provided).  In
such cases, it would be up to the extension writer to set $CPPFLAGS
accordingly.

Optionally, the WMI + OLE code could be replaced with WIN32API +
GetVersionEx().

What do you think?

Dan



More information about the win32utils-devel mailing list