有馬@FITECです。

| わたなべです.

| :# Win32API拡張モジュールってはじめて使ったけど、
| :# こんなにめんどくさかったとは……
| 
| そうそう. Win32API は 要するに syscall なんです.

Win32API を使って Windows のバージョンチェックをやってみました。
"C:" からブートすることを仮定してますが、Win9x については
これで PATH を追加できます。
NT を使うなら、環境変数ぐらい自分で修正できるだろうという仮定は
有効なのかなあ。

require "Win32API"

module Win32
  VER_PLATFORM_WIN32s        = 0
  VER_PLATFORM_WIN32_WINDOWS = 1
  VER_PLATFORM_WIN32_NT      = 2
  GetVersionEx = Win32API.new("kernel32", "GetVersionExA", ['P'], 'L')

  HWND_BROADCAST   = 0xffff
  WM_SETTINGCHANGE = 0x001a
  SMTO_ABORTIFHUNG = 0x0002
  SendMessageTimeout = Win32API.new("user32", "SendMessageTimeout",
    ['L', 'L', 'L', 'P', 'L', 'L', 'P'], 'L') 
end

def getWindowsVersion
  include Win32
  lpVersionInfo = [148, 0, 0, 0, 0].pack("LLLLL") + "\0" * 128
  GetVersionEx.Call lpVersionInfo
  dwOSVersionInfoSize, dwMajorVersion, dwMinorVersion, dwBuildNumber, 
    dwPlatformId, szCSDVersion = lpVersionInfo.unpack("LLLLLC128")

  case dwPlatformId
  when VER_PLATFORM_WIN32s         # Win32s on Win3.1
    return 'WIN32s'
  when VER_PLATFORM_WIN32_WINDOWS  # 95, 98 ?
    return 'WIN32_WINDOWS'
  when VER_PLATFORM_WIN32_NT       # NT3.x, 4.0, 2000 ?
    return 'WIN32_NT'
  end;
end

def updateEnvironment
  include Win32
  dwReturnValue = "\0" * 4
  SendMessageTimeout.Call HWND_BROADCAST, WM_SETTINGCHANGE, 0,
    "Environment", SMTO_ABORTIFHUNG, 5000, dwReturnValue
end

def checkpath dir
  return ENV["PATH"].split(":").index(dir) != nil
end

def addpath_win9x dir
  st = dir.gsub(/\//, "\\")
  if dir =~ /cygdrive\/(.)\/(.*)$/
    st = $1 + ":\\" + $2
  else
    st = "C:" + st
  end
  fn = "//c/autoexec.bat"
  f = File.open(fn, "a")
  f.write "\nset PATH=#{st};%PATH%\n"
  f.close
end

def addpath_winnt dir
  print "you shuld modify Environments. (PATH, TEMP, TMP)\n"
  # updateEnvironment
end

def addpath dir
  exit if RUBY_PLATFORM != "i386-cygwin"
  exit if checkpath dir
  case getWindowsVersion
  when /WIN32_NT/
    addpath_winnt dir
  when /WIN32_WINDOWS/
    addpath_win9x dir
  else
    print "not support."
  end
end

addpath Dir.getwd

--
 有馬 康弘 <fit0298 / fitec.co.jp>