• 締切済み

windows2000とwindowsXP,2003で利用するWindowsAPIの差異

お世話になっております。 現在VisualStudio2005 C++、OSはWindowsXPで、Frameworkに依存しないプログラムを構築中です。 現在問題となっているのは、XP、2003Serverで正常に動作していたプログラムが、Windows2000ではランタイムエラーとなることです。 APIで利用しているものとしては、ファイルの読み取り、作成を行うCreateFile()が挙げられます。 その他にも、暗号化を行うプログラミング、 参考 http://www.trustss.co.jp/smnCrypt000.html ユーザー認証に関わるプログラミング といったことを行っておりますが、どの項目においても、 うまくいかない印象を持っています。 Windows2000では、上記のようなことを行う場合にXP,2003とは違う処理を実行しなければいけないのでしょうか? もし、ご存じの方がいらっしゃいましたらご教授お願い致します。

みんなの回答

回答No.2

忘れてたのでもう1つ。 「2000とXPでの、API関数の挙動の差」は「DLLのバージョンの違い」が原因です(殆どのAPI関数はカーネルDLLによりサポートされています) 「2000にサービスパックを適用していけばXPに近づく」とは言っても、サービスパックを当ててもDLLの差異が縮まるとは限りません。 XPは2000の上位互換ですからDLL(API関数)も上位互換です。同じAPI関数でも「上位OSのXPのみにしかない機能を使った」とか「XPでしかサポートされないパラメータを与えた」とかがあると、2000でランタイムエラーが起きたりAPI関数の呼び出しに失敗するでしょう。 >ファイルの読み取り、作成を行うCreateFile()が挙げられます。 2000の場合「個人用フォルダ」以外のほぼすべてのファイルやフォルダは、一般の権限しかないデフォルト属性のユーザーにはアクセス権が与えられていません。 なので「個人用フォルダ以外は、ファイルが開けない」と思って間違いありません。「システムフォルダや他人のフォルダでのCreateFile()は常に失敗する」と思って下さい。

回答No.1

基本的に、XPと2000は「そんなに変わらない筈」です。双方のOSのバージョン番号とビルド番号を見ると「殆ど同じOSである」事が判ります。 実際、2000に今までのサービスパックを全て適用すると「外見以外はXPと同等」になります。 ただ、決定的に違うのが「ユーザーアカウントのデフォルト属性」です。 XPを普通にインストールし、普通の手順で「1人目のユーザーアカウント」を作成すると、属性に「コンピュータの管理者と同等の権限が付与」されます。 しかし、2000の場合、普通の手順で作成したユーザーアカウントは「コンピュータの一般の使用者」になり、権限は大幅に制限されます。 その「ユーザーの権限の違い」は「実行したプログラムに出来る事、出来ない事」の違いとして現れます。ユーザーの権限は、そのまま「実行プログラムの権限」になりますからね。 つまり「XPで普通に呼び出せる筈のAPI関数が、2000では権限不足でランタイムエラーになる」と言う事です。 多分、2000で「別のユーザーアカウントで実行」するなどで「コンピュータの管理者」の権限があるユーザーでプログラムを実行すれば、ランタイムエラーが起きずに動いてしまうと思われます。 2000で「プログラム自身で権限を取得するか、権限のあるユーザーで実行しないと、殆どのAPI関数がエラーになって動かない」と言うのが不評で、XPになった時に「ユーザーにデフォで管理者権限を付けとく」と言う変更を行い「一部の例外を除き、プログラム自身で権限を取得せずとも、すでに管理者権限が付いているので、API関数がエラーにならないでちゃんと動く」ようにしました。 なお「デフォで管理者権限が付いてる」のが原因で、XPはウィルスの攻撃に対して弱くなってしまっています。何でもかんでも「管理者権限で動いちゃう」から仕方が無いのですが。 蛇足ですが「XPでも、管理者権限が無いユーザーで実行すれば、やはり、ランタイムエラーで止まる」のは同じです。なので「何がしかの権限が必要なAPI関数を呼ぶ時は、プログラム自身で必要な権限の取得を行う」のが本筋です。

tohboe
質問者

お礼

お礼が遅くなり申し訳ありません。 まさかそのような事情があったとは。。。 とても勉強になりました。 自分でも管理権限についてもう少し調べてみようと思います。 ご協力ありがとうございました。

関連するQ&A