• 締切済み

API関数でOS判定

教えてください。 Win32のAPI関数「GetVersionEx」を使用して、OSの判定をおおなっているのですが、「Windows2000」「WindowsCE」「WindowsME」の判定方法がわかりません。その他の「WindowsNT」「Windows3.51」「Windows95/98」はAPI関数の戻り値(構造体)の「プラットフォームID」と「マイナーバージョン」でわかるのですが…。 どなたか回答をお願いします。 ちなみに、「WindowsME」でのマイナーバージョンを調べてらら「90」の値が返ってきました。これは、「90未満」「90以下」「90以上」「90超」のどれなんでしょうか…。

みんなの回答

  • selenity
  • ベストアンサー率41% (324/772)
回答No.2

できればOSVERSIONINFO.dwBuildNumberまで見れば、 Win-Me、Win98SE、Win98、Win95の区別や、製品版とβ版との 区別もできますよ。 szCSDVersionを見れば、サービスパックの適用状態まで 判断できます。

  • haporun
  • ベストアンサー率40% (230/562)
回答No.1

2000はNTの区分なので、dwPlatformIdにはVER_PLATFORM_WIN32_NTが入ります。 2000はNT4の後継で、dwMajorVersionに5が入るはずですが。 MEは持ってないのでわかりません。 dwPlatformId がVER_PLATFORM_WIN32_WINDOWSなのは確かですが、おそらく、dwMajorVersionは5になるのではないでしょうか。 95も98も4なので、もしかしたらMEも4かもしれませんが。 細かいところはメジャーバージョン+マイナーバージョン÷100で判別します。

関連するQ&A

  • GDBでCプログラムの関数の引数を変更したい

    関数の引数の値を書き換えたいです。 DGBのx/iコマンドでアッセンブラをみて レジスタに格納された引数の値を書き換えようと考えています。 このコマンドで書き換えたい関数の$ebpを見て書き換える予定です。 引数を書き換えたい関数の戻り値が構造体であるかないかで、$ebpからのアドレスの位置が変更されてしまいます。 他に格納されている関数の引数のアドレスが1つに固定できる方法はないでしょうか? できないとしたら、条件で関数の戻り値が構造体かどうかの判断はどこでつければよいでしょうか?

  • FDユニットとMOユニットの判定

    早速質問します。 端末に接続されている有効なドライブの検索に、API関数の「GetDriveType」を使用して以下のモジュールを作成しています。 'A~Zまでを検索 For iCnt = 1 To 26  'A~Zのドライブを設定  szBuffer = Chr(64 + iCnt) & ":\"  'API呼出し  uType = GetDriveType(szBuffer)  '戻り値の判定  IF uType=0 or uType=1 then   MsgBox szBuffer & "無効ドライブ"  Else   MsgBox szBuffer & "有効ドライブ"  End IF Next このAPIの戻り値ですと、FDユニットとMOユニットは共に「uType=2(Removable)」のリターンとして帰ってきます。 FDとMOを区別する方法はないでしょうか? ちなみに、それぞれ媒体を挿入している場合は媒体容量で判定できるのですが、媒体を挿入していない状態で判定したいのでご教授をお願いします。

  • API,PathIsDirectoryについて

    よろしくお願いします。 VB6.0sp6,Windows2000professionalsp4です。 VBでのディレクトリの有無の判別方法を検索していて、サンプルをひとつ見つけたのですが・・・↓がコードです。 ------------------------------------------------ Private Declare Function PathIsDirectory Lib "SHLWAPI.DLL" Alias "PathIsDirectoryA" _ (ByVal pszPath As String) As Long ' ' ディレクトリであるかどうか ' Private Function IsDirectory(ByVal strFileName As String) As Boolean ' strFilename : チェックしたいディレクトリ名 ' 戻り値 : ディレクトリであればTrueを返す。 Dim lngResult As Long lngResult = PathIsDirectory(strFileName) IsDirectory = Not (lngResult = 0) 'ここが理解できません End Function Private Sub Command1_Click() Dim strFileName As String strFileName = "C:\WINNT\Profiles\Administrator\My Documents\HEROPA\TestCls\SHLWAPI" Msgbox IsDirectory(strFileName) End Sub -------------------------------------------- IsDirectory関数は、PathIsDirectoryの戻り値がLong型のため、それをBooleanに直すためのものだと思うのですが、 IsDirectory = Not (lngResult = 0)はどういう原理なのでしょうか? これだとlngResultにどんな値が入ろうがIsDirectoryに返されるのはTrueになってしまうと思うのですが(lngResultに0が代入され、それがNotされるから)、しかし実際に実行してみるとちゃんとTrueとFalseを判定しています。いったいどうしてなのでしょうか? それと、PathIsDirectoryの宣言で、関数の戻り値がLongになっていますが、他に見つけたサンプルではBooleanとなっていました。どちらが正しいのでしょうか?

  • 関数について

    協力お願いします。 2問あります 1問目です。 西暦年yearを引数として受け取り, 閏年かどうかの判定結果を戻り値として返す関数leap_year()を作成せよ. ただし,leap_year()は,閏年の場合は1を返し, そうでない場合は0を戻り値として返すものとする. 提出するプログラムは,関数leap_year()だけでなく, メイン関数main()も含む下記プログラムを完成させる形で作成する。 #include <stdio.h> /* ここに関数leap_year()のプロトタイプ宣言を記述する */ int main() { int i, year[3]; for (i=0; i<3; i++) { printf("西暦年を入力してください"); scanf("%d", &year[i]); if (leap_year(year[i]) == 1) { printf("閏年です.\n"); } else { printf("閏年ではありません.\n"); } } } /* ここに関数leap_year()を定義する */ 2問目です。 mのn乗を計算する関数power()を作成せよ. ただし,関数power()はm,nを引数とし, 戻り値としてmのn乗の値を返すものとする. m,nは,正整数とする.プログラムには, 関数power()だけでなく,m,nを入力し, mのn乗を出力するメイン関数main()を含むものとする. main()は,power()の前に記述すること. また,power()のプロトタイプ宣言も記述すること。 よろしくお願いします。

  • 日付チェック関数について

    いつもお世話になっております。 先日、『YYYY/MM/DD』形式から年・月・日を取り出し、整数にする質問をさせて頂き、無事に行うことができました。 ありがとうございます。 再びの質問で恐縮ですが、どうか教えてください。 先日の質問に引き続き、日付の妥当性をチェックする関数を考えています。そこで、「http://f4.aaa.livedoor.jp/~pointc/log453.html」というサイトを見つけたのですが…。 その中で、"20020101"という文字列を『strncat』で分割し、『atoi』してから『tm構造体』へ代入しています。 この『tm構造体』というものがよく分かりません。 調べて見ると、『time()』関数にて取得した暦を『localtime()』関数を使ってローカルタイムに変換し、その値が『tm構造体』となって戻ってくる。というようなことが書いてあります。(正しい理解ができているか、不安なところですが。) なぜ、『tm構造体』へ代入しただけで、日付を算出できるのでしょうか?『tm構造体』は『localtime』関数の戻り値ではなく、単体で利用できるのでしょうか。他に関数というかライブラリ関数のようなものは見当りません。 『tm構造体』自体が計算か何かをしているのでしょうか? 乱文で申し訳ありません。 どうかご協力お願いいたします。

  • C言語 関数について

    協力お願いします。 2問あります。 1問目です。 西暦年yearを引数として受け取り, 閏年かどうかの判定結果を戻り値として返す関数leap_year()を作成せよ. ただし,leap_year()は,閏年の場合は1を返し, そうでない場合は0を戻り値として返すものとする. 提出するプログラムは,関数leap_year()だけでなく, メイン関数main()も含む下記プログラムを完成させる形で作成する。 #include <stdio.h> /* ここに関数leap_year()のプロトタイプ宣言を記述する */ int main() { int i, year[3]; for (i=0; i<3; i++) { printf("西暦年を入力してください"); scanf("%d", &year[i]); if (leap_year(year[i]) == 1) { printf("閏年です.\n"); } else { printf("閏年ではありません.\n"); } } } /* ここに関数leap_year()を定義する */ 2問目です。 mのn乗を計算する関数power()を作成せよ. ただし,関数power()はm,nを引数とし, 戻り値としてmのn乗の値を返すものとする. m,nは,正整数とする.プログラムには, 関数power()だけでなく,m,nを入力し, mのn乗を出力するメイン関数main()を含むものとする. main()は,power()の前に記述すること. また,power()のプロトタイプ宣言も記述すること。 よろしくお願いします。

  • エクセルのif関数で8つ以上ある場合について教えて下さい。

    エクセルのif関数で8つ以上ある場合について教えて下さい。 バージョン:エクセル2002 以下のような場合       1,000未満 → A 1,000以上 1,500未満 → B 1,500以上 2,000未満 → C 2,000以上 2,500未満 → D 2,500以上 3,000未満 → E 3,000以上 3,500未満 → F 3,500以上 4,000未満 → G 4,000以上 4,500未満 → H 4,500以上 5,000未満 → I 5,000以上       → J 現在のエクセルバージョンでは、 if関数の7レベルを超えてしまい、Lookup関数では一致した値しか拾ってくれません。 このような場合、以上、未満などの比較演算子を使用した範囲内の数値の分岐結果を取得するには どのようにすればよいのでしょうか? 現在は、次のように表を作成して行っております。     A     B   C  ←セル列  1        1,000  A  2  1,000   1,500  B  3  1,500   2,000  C  4  2,000   2,500  D  5  2,500   3,000  E  6  3,000   3,500  F  7  3,500   4,000  G  8  4,000   4,500  H  9  4,500   5,000  I  10  5,000        J  ↑ セル行 別の関数などを使用してできる場合(VBA不可)などでも構いませんので、 どなたかご教授願います。 宜しくお願いします。

  • FindFirstFileのファイル属性の戻り値が違う?

    Windows2000 Pro と、Windows2000 Server とで、 FindFirstFile関数の戻り値となる構造体の、 WIN32_FIND_DATA の dwFileAttributes As Long の戻り値が、どうも違うようです。 (端末によっても違うような…?) Win2000 の Pro と Server との違いなどが明記されて 居る場所をご存知の方いらっしゃったら教えてください。

  • SNMPマネージャAPIでメモリリークしてしまう

    初めて投稿します。 ネットワークに接続したプリンタ4台を、SNMPを使って状態監視するソフトを作成しています。以下のソース(文字数制限のため、大半をコメントで記述しています)を実行すると、SnmpMgrRequest()関数内でメモリリークを起こします。 この関数の戻り値はエラーではありません。しかもプリンタ1台のみを監視するとメモリリークしません。この関数をコメント化しても起きません。 SNMPは始めてなので何が悪いのかよくわかりません。 どなたか何かご存知であればご教示お願いします。 開発環境はWindowsXP(SP1) VC++6 SP5を使用しています。 (ソースの拡張子は.cです。) void main(){ while(1){ for (i = 0 ; i < 4 ; i++) { mib=StsGet([プリンタのIPアドレス]); } Sleep(600); } } int StsGet(LPSTR adr) { //SnmpUtilMemAlloc ()でSNMPエージェントのアドレス取得 //SnmpUtilMemAlloc()でコミュニティ取得 //変数バインディングの初期化 //SnmpMgrStrToOid()でOIDを文字列から値に変換 //SnmpUtilMemReAlloc ()で変数バインディングにメモリを割当て //変数バインディングにOIDを追加 //SnmpMgrOpen ()でSNMPマネージャAPIのオープン(タイムアウト:100ms、リトライ:1回) // SnmpMgrRequest()でSNMPマネージャAPIに指定操作(Get)を要求 //SnmpUtilVarBindListFree(),SnmpUtilMemFree()で各変数を解放 //SnmpMgrClose()でSNMPマネージャAPIとの接続を終了 return [プリンタ状態;] }

  • ファイルの入出力

    氏名・身長・体重が入っているファイルからデータを構造体として読み取りその人の肥満度を表示するプログラムを作りたいのですが一考にわかりません。。。誰か知恵を貸してくれませんか 肥満度は20未満が「やせすぎ」20以上25未満は「普通」25以上は「肥満」としています。ファイルには27にんのデータが入っています。肥満度の計算は関数を作成で、関数名はbmiで引数は構造体、戻り値は実数です。肥満度の計算は体重÷身長÷身長です。 構造体は自分で定義します。よろしくお願いします

専門家に質問してみよう