先ほどMS-DOSのコマンドについて質問したものですが、私の思い違いがあったようなので改めて質問しなおします。


http://www.hatena.ne.jp/1085063318

上記質問にて、

「(MS-DOSのコマンドは)Windows用のAPIがあり、それを利用するようになっているコマンドラインのプログラムです。」

とのお答えを頂きましたが、これはつまり、WindowsエクスプローラとMS-DOSのコマンドが実質的に同じAPIを呼び出している、ということだと解釈して良いのでしょうか。

そのことを示す情報ソースも、ご存知でしたら教えて下さい。

宜しくお願い申し上げます。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2004/05/21 00:53:04
  • 終了:--

回答(7件)

id:cx20 No.1

cx20回答回数607ベストアンサー獲得回数1082004/05/21 01:13:04

ポイント50pt

http://www.dependencywalker.com/

Dependency Walker (depends.exe) Home Page

「Dependency Walker 2.1」というツールを使うと、

アプリケーションが利用しているDLL(API)の一覧を表示できます。

例えば、以下のアプリケーションをこのツールで解析してみると、

・EXPLORE.EXE(Windows Explorer)

・CMD.EXE(Windows NT Command Processor)

KERNEL32.DLL(プロセス、メモリや周辺装置を管理するAPIを含むDLL)

という DLL 利用していることがわかります。

この DLL には MoveFile() のような API を含みます。

実際には、これらの API を呼び出すことによりファイルの移動と

いった操作を行います。

Win32 APIとは?

id:toramaru666

迅速なご回答ありがとうございます。

するとやはり、両者は同じプログラム(DLL)を利用しているわけですね。

それはそうと、WinAPIを利用しているということは、やはり

ご紹介いただいたツールも面白そうですね。

早速DLしてみます^^

迅速なご回答ありがとうございます。

するとやはり、両者は同じプログラム(DLL)を利用しているわけですね。

ということは、現在「MS-DOSコマンド」と呼ばれているものの実体は

かつてMS-DOS時代に使われていたコマンドとは意味的に違うものだ

ということになるわけでしょうか…うーん、奥が深いです。

ご紹介いただいたツールも面白そうですね。

早速DLしてみます^^

もう少し色々伺ってみたいので、他にも何かご存知の方、ぜひご回答を

お願いしますm(_ _)m

2004/05/21 01:20:15
id:takasiym No.2

takasiym回答回数165ベストアンサー獲得回数02004/05/21 01:14:34

ポイント50pt

http://www.atmarkit.co.jp/fwin2k/operation/command001/command2.h...

連載:Windows 2000コマンドライン徹底活用 第1回 コマンド プロンプト入門 -- 1.コマンド プロンプトを使ってみる

宜しいです。

「Windowsは、こうしたコマンドライン プログラムをサポートするために、コンソール ウィンドウ関連のAPIを持っている。」

という記述から、

cmd.exeは、コンソール関連のAPI関数の組み合わせでできています。

id:toramaru666

ご回答ありがとうございます。

うーん、なんだかまた分からなくなってきたのですが、コマンドプロンプト上で実行されるMS-DOSのコマンド類は、cmd.exeが内包しているということでしょうか?

実をいうと、コマンドそのものは別のプログラムとして用意されていて、それをコマンドプロンプト上から呼び出している、というようなイメージを抱いていたのですが…

2004/05/21 01:24:09
id:aki73ix No.3

aki73ix回答回数5224ベストアンサー獲得回数272004/05/21 01:18:26

ポイント50pt

さっきの質問に突っ込もうと思ったのですが締め切られてしまったので

多分、質問間違えていませんか?

MS-DOSはIO.SYS-MSDOS.SYSの上にありファンクションコールという機能を提供しており、Command.comはファンクションコールを利用したCUIを持ったプログラムに過ぎません。

Windows APIとMS-DOSコマンドは全く関係なくAPIが利用してるわけではなくデバイスドライバがMS-DOSファンクションコールをエミュレーションして呼び出すようになっています

Windowsエクスプローラーにはコマンド・・・というのはありませんし同じAPIというのも全然違うレベルで変な話です

もう一度、整理して質問された方がいいと思います

id:toramaru666

そうですね、だんだん混乱してきました(^^;

私が知りたいのは、「エクスプローラ上でファイル名変更をする時に

呼び出されるプログラム」と「コマンドプロンプト上で ren を実行した時に

実質的に動くプログラム」が同じかどうか、というレベルの話です。

あるホームページで「エクスプローラもコマンドプロンプトもどちらも

Windowsのシェルである」という記述を見て、「ということは、つまり

別の操作画面から同じ実体(プログラム)を呼び出して処理を

実現しているということ?」と考えたわけなのです。

2004/05/21 01:31:10
id:virus No.4

virus回答回数183ベストアンサー獲得回数12004/05/21 01:34:02

ポイント50pt

http://www.microsoft.com/japan/msdn/default.asp

ご指定のページが見つかりません

url はダミーと言うか、ここにある膨大な資料を読み解けば全てわかります :-)

Windows は大きく分けると3種類あります。

Win3.1 およびそれ以前の16ビット版。Win9xとME の32ビット+16ビット混交版。NT3、NT4、2000、Xp等のNT系(32ビット版)です。

Win3.1 ではベースにMSDOSがあり、Windows API は基本的にDOSを呼び出す形で実装されています。

Win9x では基本にMSDOSがあるのは変わりませんが、Windows API のかなりな部分は、DOSと整合性を取りながら、独自の実装も行われてます(32ビット化。DOS はあくまで16ビットですから)。

NT系ではすべて独自のカーネルとして実装されており、NTカーネルで完結してます。

Windows API ですが、これはプログラムから呼び出すプログラムインターフェースであり、コマンドのように人間にわかる形にはなってません。機能も単機能です。たとえば ren に相当する機能は一つのAPI になってますが、copy はファイルをオープンして読み取り、コピー先にファイルを作成し・・・と、それぞれが一個のAPIになってます。

この中継ぎをするのが、コマンドインタープリタ(プロンプト)で、これはカーネルの一部ではありません。単なるユーザプログラムです。

これが入力した文字を解析して、どのAPIをどういう順序で呼び出せば良いかを決め、Windows の API(と言うプログラム機能(関数)) を呼び出します。

つまりコマンドプロンプトも全てWindows の機能を使っていることに変わりはありません。

直接DOSを呼び出すのは、Win9x にあるDOSモードだけです。

id:toramaru666

大変丁寧なご回答ありがとうございます。

なんとなく分かってきました。

実は初心者向けパソコン教室で講師をしているんですが、生徒さんから質問されてしまったんです。

自分なりにまとめなおしてみたいと思います。

ありがとうございました^^

2004/05/21 01:46:22
id:takasiym No.5

takasiym回答回数165ベストアンサー獲得回数02004/05/21 01:36:47

ポイント50pt

上記ダミーです。

> WindowsエクスプローラとMS-DOSのコマンドが実質的に同じAPIを呼び出している、

失礼致しました。

この部分はちょっと違います。

explorer.exe(エクスプローラ)が使用しているAPIと、

cmd.exe(コマンドプロンプト)が使用しているAPIは、

いずれもWindows OSが用意しているAPI関数群のうち一部を使用しています。

しかしこの二つの同じAPI関数を使っているかどうかは、

ブラックボックスなので調べられませんでした。

すみません。

Microsoft Visual Studioにバンドルされている、

spy++でアプリケーションが呼び出している

api関数を調べることはできることはできますが、

結構大変な作業です。

「コマンドプロンプト上で実行されるMS-DOSのコマンド類」は、

基本的に全てWindowsアプリケーションです。

cmd.exeのコマンドライン上で動作するアプリケーションを「コンソールアプリ」と呼び、

Windowが開いて動作するアプリケーションを「GUIアプリ」と呼びます。

したがって、「MS-DOSのコマンド類は、cmd.exeが内包」しているわけではありません。

MS-DOSのコマンド類もWindowsアプリケーションです。

> コマンドそのものは別のプログラムとして用意されていて、それをコマンドプロンプト上から呼び出している、

そのイメージで合っています。

id:toramaru666

重ね重ねご回答ありがとうございます。

詳しく調べていただいて本当に助かりました。

2004/05/21 01:49:52
id:akimasa2000 No.6

akimasa2000回答回数276ベストアンサー獲得回数02004/05/21 01:38:27

ポイント10pt

コマンドプロンプトはCUIのシェルで、エクスプローラーはGUIのシェルなので、結局は同じカーネルを使っています。

id:aki73ix No.7

aki73ix回答回数5224ベストアンサー獲得回数272004/05/21 02:08:30

ポイント50pt

http://www.page.sannet.ne.jp/harusaki/node7.html

WindowsNTでコマンドプロンプトの設定が上手くいかないよぉ

>私が知りたいのは、「エクスプローラ上でファイル名変更をする時に呼び出されるプログラム」と「コマンドプロンプト上で ren を実行した時に実質的に動くプログラム」が同じかどうか、というレベルの話です。

DOS

RENコマンド→DOSファンクションコール→仮想DOSマシンエミュレーション→IOにアクセス

Windows

名前を変更→WINAPI MoveDirectory→Windows Kernel→IOにアクセス

なので、同じAPIでは、ないですね

Windows9xもWINDOWSからはLFN対応のAPIを呼んでいるので。MS-DOSのファンクションコールとは又ちょっと違います、ただ、NT系のOSよりはずっと近い仕組みをしてるようですが

ですから、DOSのコマンドプロンプトでファイル操作を行うとロングファイルネームが一部無効になってしまうことがありします

あと、NT系の場合さらにファイル名を指定して実行でCMDとCOMMANDの間にも又違いがあったりするんですけどね^^;

id:toramaru666

丁寧なご回答ありがとうございました。

色々なご意見を伺えて大変参考になりました。

日ごろ当たり前に使っているWindowsも、中をのぞくと奥深いですね。

今後も勉強を重ねたいと思います。

皆様、夜遅くに本当にありがとうございました。

回答はここで締め切らせて頂きますが、閲覧できなかった回答者の方にもこの場を借りて御礼申し上げます。

また宜しくお願いします^^

2004/05/21 02:38:59
  • id:cx20
    補足。

    自分の説明文に肝心の COMMAND.COM(MS-DOSコマンドプロンプト)の
    説明が抜けていたので補足しておきます。

    Windows NT/2000/XP では、2種類のコマンドプロンプトがあります。
    ・CMD.EXE(32bit環境)
    ・COMMAND.COM(16bit環境)

    CMD.EXE は、単に 32bit アプリケーションですので、
    EXPLORER.EXE(エクスプローラ)と同様に
    直接 Win32 API(KERNEL32.DLL)を呼び出して
    ファイル操作等を行っています。

    一方、COMMAND.COM は、NTVDM.EXE(仮想 DOS マシン)を起動し、
    その中で MS-DOS(16ビット環境)をエミュレートします。
    この為、ファイル操作は、MoveFile() といった、単一の API
    ではなく、ReadFile() / WriteFile() のような、複数の API
    を組み合わせて実現されているものと思われます。

    <32bit環境(コマンドプロンプト)>
    CMD.EXE(REN コマンド)
     ↓
    KERNEL32.DLL(ファイル操作API)
     ↓
    ドライバ(ファイルI/O)

    <16bit環境(MS-DOS コマンドプロンプト)>
    COMMAND.COM(REN コマンド)
     ↓
    NTVDM.EXE(仮想 DOS マシン)
     ↓
    KERNEL32.DLL(仮想マシンに対応するファイル操作)
     ↓
    ドライバ(ファイルI/O)

    また、EXPLORE.EXE の場合、

    <32bit環境(エクスプローラ)>
    EXPLORE.EXE(エクスプローラ)
     ↓
    SHELL32.DLL(GUIを伴うファイル操作。進捗表示など)
     ↓
    KERNEL32.DLL(ファイル操作API)
     ↓
    ドライバ(ファイルI/O)

    のように、途中に SHELL32.DLL が入ってくると思いますが、
    実質的には、CMD.EXE と同様のファイル操作を行っている
    と考えても良いと思います。

    したがって、

    ・CMD.EXE はエクスプローラと実質的に同じ API を呼び出している。
    ・COMMAND.CMD は MS-DOS(マシン)をエミュレートしている為、
     エクスプローラと同じ API を利用しているとは言えない。

    と言えると思います。

    それから、MS-DOS の「コマンド」ですが、
    「内部コマンド」と「外部コマンド」があります。

    CD や RENAME は内部コマンドで、
    FORMAT や XCOPY は外部コマンドです(環境によります)。

    # 説明に誤りがありましたら、どなたかフォロー下さい(^^A

    http://www.hieda.net/pcnwbt/basic/command.htm
  • id:takasiym
    自分も補足

    >それから、MS-DOS の「コマンド」ですが、
    >「内部コマンド」と「外部コマンド」があります。
    >CD や RENAME は内部コマンドで、
    >FORMAT や XCOPY は外部コマンドです(環境によります)。
    いや、そうなんです。
    「cmd.exeが内包している」コマンドが「内部コマンド」、
    「別のプログラムとして用意されてい」るコマンドが「外部コマンド」に該当します。
    なので、
    > したがって、「MS-DOSのコマンド類は、cmd.exeが内包」しているわけではありません。
    > MS-DOSのコマンド類もWindowsアプリケーションです。
    という僕の二回目の回答も厳密には間違っているわけです(汗。
    失礼いたしました。

    それから重箱の隅で恐縮ですが、KERNEL32.DLLやSHELL32.DLLは、
    単一のAPIではなく、複数のAPIが入ってますよ。>cx20様
    ところで自分は、
    「Microsoft社内の開発者は果たしてAPI関数という使いにくい形で、
    kenel32.dllとかshell32.dllに内包されている機能を使っているだろうか?」、
    という強い疑念を持っています。
    実はもっと簡単な利用方法があって、
    もっと効率よくアプリケーションを開発している疑いがあります。
    自社のアプリケーションを保護するため、
    他社に使いにくいAPI関数群しか用意しない(公開しない)、
    といった事は企業戦略上あり得る話だと思います。
    では、、、
  • id:toramaru666
    ありがとうございます

    親切に色々教えていただいた上に補足情報まで、本当にありがとうございます。
    皆さん、お詳しくてびっくりです(@_@

    ここ(はてな)、使い始めて1〜2ヶ月くらいであまり詳しいことが
    分からないのですが、この補足のツリーにはポイントをお送りすることは
    できないのですよね?なんだかとっても申し訳ありませんm(_ _;m

    内部コマンドと外部コマンドについては、私も色々と調べてみて、おぼろげに
    イメージをつかめました。
    そこで新たな疑問が湧いたのですが、たとえば、Windowsの外部で第三者が
    作った「いわゆるコンソール・アプリ」なんかも、やはり外部コマンドと
    呼んでしまって良いのかしら?

  • id:dalian3
    ポイント送信

    >ここ(はてな)、使い始めて1〜2ヶ月くらいであまり詳しいことが
    >分からないのですが、この補足のツリーにはポイントをお送りすることは
    >できないのですよね?なんだかとっても申し訳ありませんm(_ _;m
    横から失礼します。
    300ポイント以上持っていれば、ポイント送信が可能です。
    「Myはてな」タブをクリックして、「ポイント送信」を選んでください。メッセージを添えて、ポイントを送ることが出来ます。
  • id:cx20
    Re:ありがとうございます

    >そこで新たな疑問が湧いたのですが、たとえば、Windowsの外部で第三者が
    >作った「いわゆるコンソール・アプリ」なんかも、やはり外部コマンドと
    >呼んでしまって良いのかしら?

    ■ マイクロソフト単語帳
    http://www.microsoft.com/Japan/Terminology/

    で「外部コマンド」を調べたところ、

    -----------------------------------------------------------
    外部コマンド 【 = external command 】

    Windows が稼動するコンピュータ上で実行可能なコマンドの種類
    (実装方式) の 1 つ。

    独立した実行可能ファイルとしてハード ディスク上に保存され、
    コマンドの起動時にディスク ドライブからそのプログラム ファイ
    ルが読み込まれる方式のコマンドのこと。

    例えば、 『 .EXE 』 のファイル拡張子を持つファイルは、すべて
    この外部コマンドに該当する。
    -----------------------------------------------------------

    と、あります。

    ですので *.exe というファイルすべて外部コマンドと呼んでも
    構わないと思います。

    http://www.microsoft.com/japan/Terminology/query.asp?id=1266&q=%u5916%u90E8%u30B3%u30DE%u30F3%u30C9&kbid=&key=&ui=S&dev=P
  • id:cx20
    Re:自分も補足

    ツッコミありがとうございます。

    >それから重箱の隅で恐縮ですが、KERNEL32.DLLやSHELL32.DLLは、
    >単一のAPIではなく、複数のAPIが入ってますよ。>cx20様

    単一の API と誤解を招くような書き方でした。すみません。

    もう少し詳しく書くと、

    KERNEL32.DLL … 32 ビット ベースの Windows API のコア サポート
           (ファイル操作、メモリ管理、リソース処理などの API )
    SHELL32.DLL … 32 ビット シェル (32-bit Shell) API ライブラリ
           ( Windows のユーザーインターフェイスを提供する API )

    という感じでしょうか( MSDN ライブラリからの引用ですが。)

    >他社に使いにくいAPI関数群しか用意しない(公開しない)、

    それはあるでしょうね。

    OS がバージョンアップしたころに、古い API を公開したり・・・とか。

    もしかしたら、次の Windows(Longhorn)が出るころに、
    Windows XP の 非公開 API が公開されるかもしれませんね(苦笑)(^^A

    自分の場合、そんなに沢山 API を公開されても
    使いこなせないので、今のままで十分です。

    ただ、MSDN ライブラリ日本語版の充実(英語ドキュメントの翻訳)は切に願うところですね。
    知りたい API の使い方は、英語でしか情報提供されていなかったりするし。
    無いよりはマシですが・・・(T-T)

    --

    http://www.geocities.co.jp/SiliconValley/5634/t82D0_0003.html#1478

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません