有馬@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>