みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

C++ API 全般 APIの概要は

独学にてプログラミングを勉強しているのですが、いきづまってしまったので質問お願いします。

※Visual Studio 2008 Express Editionsを使用しています。

まだプログラミングに関しての勉強を始めて1ヶ月程度で、最初はVB.NETから始めて、最近C++に乗り換えました。
趣味の範囲でのゲームを作ろうと思っていて、C++とDirectXでの開発を予定しています。(しかし、最終的にはゲームに限らずプログラミングの技術と知識を習得することを目標にしています。)(DirectXに関してはまだ手をつけていません。)
まったく1からのスタートで、現在win32コンソールアプリケーションにてコードの勉強をしているところです。

勉強に使っている参考文献は
・VisualC++.NET逆引き大全500の極意
・ゲームプログラマになる前に覚えて起きたい技術(これを買うには早すぎたようです…。第一章も半分くらいしか理解できません…。)

サイトは
・主に「0からのゲームプログラミング」というサイトです。
http://www.plustarnet.com/aspil/Programming/



本題の質問ですが、APIというものがいまいち理解できません。
(1)上記のような目的で使用するAPIは、標準 Windows APIというものでいいのでしょうか?

(2)win32コンソールアプリケーションでは実行できるのに、win32プロジェクトでは実行できないのはなぜでしょうか?
#include<windows.h>

int WINAPI WinMain(
HINSTANCE hInstance ,
HINSTANCE hPrevInstance ,
PSTR lpCmdLine ,
int nCmdShow ) {
MessageBox(NULL , TEXT("Hello Wold!") ,
TEXT("メッセージボックス") , MB_OK);
return 0;
}

(3)http://www.plustarnet.com/aspil/Programming/CConsole.htm
このURLのコンソールAPIというのは、一般的に使われているものでしょうか?それともこのサイトのオリジナルのものでしょうか?win32コンソールアプリケーションでAPIを使うには、このURLのCConsoleクラスとうものをインクルードしないといけないのでしょうか?#include<windows.h>と宣言することによって気軽に使いたいものを使うことはできないのでしょうか?

(4)#include<windows.h>
とした場合、作るものが「win32コンソールアプリケーション」だったり「win32プロジェクト」だったり「windowsフォームアプリケーション」だったりで、使用方法などがまったく別になってしまうのでしょうか?

(5)そもそも、上記の目的の場合APIを勉強する必要はあるでしょうか?

(6)勉強をしたほうが後々に役立つ場合、どのAPIを勉強するのがいいのでしょうか?(APIといっても様々なものがあるんだなと思い質問しました。もし勘違いでAPIというものは一つしかないとしたらすみません。)


なぜAPIに関してかというと、単純に上記のサイトで言語編の一番上から順に見ていったからです。
初心者すぎて質問が的外れかもしれませんがよろしくお願いします。

投稿日時 - 2009-03-25 20:55:55

QNo.4826710

困ってます

質問者が選んだベストアンサー

まず"API"というものそのものについてわかっておられないようです。

現在のプログラミングは非常に複雑化してきました。
また、(特にプロフェッショナルな場合)納期も短期化してきています。

そんなわけで、プログラミングも一から全て作るのは非現実的な状態です。
誰かの作ってくれたものを利用する場面が非常に多くなりつつあります。
(並行して開発する場合も多くあります)

その際、
どのような物(関数でも良いし、クラスとかでも良い)をどうやって
(パラメータとか呼び出し順序とか)
使うか
を定めておかないと、利用しようにも利用できませんよね。
この定めた規約のことをAPIと呼びます。

Windowsには
・ファイルを操作する関数
・画面にグラフィックを描画する関数
等々様々なものが提供されています。

たとえば、ファイルを操作するには
CreateFileで開き、ReadFileで読み込み、WriteFileで書き込み
CloseHandleで閉じる
という手順が定められています。
この規約は”Win32API”と呼ばれます。
CreateFileなどWin32で定められた個々の関数は
Win32API関数
と呼ばれます。

Windows上で動くプログラムは基本的には
Win32APIを利用します。

しかし、Win32APIには色々不便な点も多く、
それを補うものが作られてきました。
DirectXもその一例です。
もちろん、DirectXも(ごみではなく)"利用される"ために作られたものですので
Win32API同様、利用するための規格(API)があります。
Direct X APIと呼ばれたりします。

ですから
(1)はWin32APIです
(2)は明らかに逆です。
   Win32プロジェクトとは通常のEXEの他にDLL(EXEのための部品です。単独では動きません)など様々な開発を行えます。コンソール専用ではないので、
コンソール用の設定がされていません。したがって、コンソールのソースを持ってきただけでは動作するようになりません。
(自分でプロジェクトの設定を行えばコンソールアプリになります)

(3)についてはそのサイト専用です
ピンク色の部分をコピーしてConsole.hという名称で保存してください。
そして#include "Consol.h"
すれば自動的にWindows.hも取り込まれます。
別途Windows.hを取り込む必要はありませんし
Windows.hで定義されているものは自由に使えます

(4)win32コンソールアプリケーションとWindoiws プロジェクトの違いについては
先に述べましたので省略します。
"Windows フォームアプリケーション"とは
".NET (ドット ネット)"という新しい技術に基づくものです。
今までのWin32APIとは別物です。
当然APIも異なります。
原則的にはWin32APIは利用できません。
(C++/CLIという方法で利用できますが、それなりの設定が必要です)

(5) 目的に合ったAPIを勉強する必要があります。
先ほどものべましたが".NET"を使うには
Win32APIとは別の知識が必要です。
逆に、".NET"の知識しかない場合、Win32コンソールアプリは作れませんので
Win32APIを勉強しなくてはなりません。
もっとも、これは厳密な言い方ではありません。
Cの標準関数で収まる範囲であれば、Win32APIの知識は不要です。

(6)
既に述べています。
APIはたくさんあります。
あなたも、たとえばWin32プロジェクトでDLLを作成する場合、
どのように利用するかを考えてAPIを定める必要があります。

投稿日時 - 2009-03-25 23:37:07

お礼

(2)に関しては完全に勘違いです。おっしゃるとおり逆でした。すみません。

的確で大変詳しい回答とても参考になりました。

しかし回答の中で気になったのが、購入したC++.NETの本は、質問で述べたような目的(※1)の場合、少し的外れなものになってしまうのでしょうか?

また、これからは、基本的なコードの勉強を並行しながらAPIとDirectXの勉強。ということでとりあえずは間違いはないでしょうか?他に、 「先にこういう分野も勉強したほうがいい」というものはありますでしょうか?

※1)趣味の範囲でのゲームを作ろうと思っていて、C++とDirectXでの開発を予定しています。(しかし、最終的にはゲームに限らずプログラミングの技術と知識を習得することを目標にしています。)(DirectXに関してはまだ手をつけていません。)

投稿日時 - 2009-03-26 01:31:12

ANo.4

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(6)

ANo.6

(2)に関して。

「win32コンソールアプリケーション」とは、簡単に言えば「コマンドプロンプト上で動く物」の事です。

一般的に「コンソール」とは「入出力端末」の事を指し、キーボードでの文字入力とモニターでの文字表示が出来る装置の事を言います。

で「モニターに、固定のフォントで固定の位置に固定の大きさで決まった文字しか表示出来なかった時代」には「コンソールで入出力するのが標準」だったのです。つまり「GUI(グラフィカル・ユーザー・インタフェース)が無かった時代」です。もちろん、マウスもありません。

この当時のコンピュータは、グラフィック表示機能が無くて(あっても高価なオプション)、画面表示のスペックは「半角英数で80桁25行」とか「全角で40桁25行」とか「モノクロ表示時は80桁25行、カラー表示時は80桁20行」とかって仕様になってました。

そして、C言語は「コンソールで入出力するのが標準だった時代に考案された」ので「コンソールでの入出力を標準的にサポートしている」のが普通でした。

その為、伝統的にライブラリに「標準入力(キーボードの事)」と「標準出力(文字ベースのモニター表示の事)」を扱う関数が用意されています。

C言語の教本で良く見かける「scanf関数」とか「printf関数」とかが、これにあたります。

これら「標準入出力関数」を用いた場合、出来上がったプログラムは「コンソールが存在する環境」ででしか動きません。

言い換えれば「キーボード」と「文字ベースでの表示装置」が必須となります。

このように「コンソールが存在する環境で動くプログラム」のうち、32/64ビット版Windows(Windows95以降)用の管理下で動く物を「win32コンソールアプリケーション」と呼びます。

単に「コンソールアプリケーション」と言ってしまうと、動作環境がLinuxだったりUnixだったりMacOSだったりするかも知れないので「Win95以降のWindowsのコマンドプロンプト上で動く物に限定する場合に、win32コンソールアプリケーションと呼ぶ」のです。

どうして「windowsコンソールアプリケーション」でなくて「win32コンソールアプリケーション」言うかと言うと「16ビットCPU時代にも、Windows3.1と言う物があり、それは除外される」からです。

単に「windows」って言ってしまうと「windows95以前の、古いwindows3.1なども含まれてしまう」ので「32ビット時代になってからのwindows以降」と言う意味で「win32」という単語を頭に載せている訳です。

そして、こういう「コンソールアプリケーション」は「GUI(グラフィカル・ユーザー・インタフェース)を持っていない」ので、ウィンドゥを開いたり表示したりするAPI関数は呼び出せません。

なので、win32コンソールアプリケーションは、ダイアログボックス(つまり、ウィンドゥ)を開くAPI関数である「MessageBox関数」は使えないのです。

使えないのですから、実行出来なくて当たり前ですね。

なお、すべてのAPI関数が使えない訳ではないので「GUI(グラフィカル・ユーザー・インタフェース)に関わりの無いAPI関数」は呼び出す事が可能です(例えば、ファイルをオープンするAPI関数など)

投稿日時 - 2009-03-26 16:16:35

ANo.5

zwi

大体の結論は出ているようなのでWin32APIについてだけ。

Windowsでプログラムする場合はゲームにしてもアプリにしてもOS自体の知識が不可欠です。なので、まずOSと絡めたAPIの理解をお勧めします。
参考図書↓
http://itpro.nikkeibp.co.jp/article/MAG/20061218/257206/?ST=develop
どんなAPIをどんな時に使うのかWindowsってどんな仕組みで動いているのかの概要がつかめます。

C言語ですが、APIの入門サイトです。
http://wisdom.sakura.ne.jp/system/winapi/index.html
「Windowsゲームプログラミング」の本はDirectXを使わない珍しい本ですが、APIとゲームプログラミングの基礎を学べると思います。

「猫でもわかる」シリーズもAPIのサイトと本で有名です。
http://www.kumei.ne.jp/c_lang/
「Windows SDK編」がWin32APIを中心に書かれています。MFCを使っていないので、MFCが使えないVisual Studio 2008 Express Editionでも問題なく使えます。
ちなみにMFCを使うためには有料のVisualStudioを購入する必要があります。

以上ですが、参考になれば幸いです。

投稿日時 - 2009-03-26 11:44:35

ANo.3

APIとは、「Application Program Interface」の略で、
「アプリケーションがOSの機能を使う方法」を示す一般名詞です。

Microsoft の Windows では、「Windows API」もしくは「Win32 API」と呼ばれるAPIに基づいて、OSの提供する各機能を利用できます。

OSが提供する機能の話であり、使用する言語などには因りませんので、
Windows 用のプログラムを作るのであれば、C++だろうがC#だろうが、
最終的には必ず「Windows API」を通してOSの機能を呼び出すことになります。

Windows API は、そういった汎用性がある代わりに、使い勝手はそれほど良いものではありませんので、
各種言語環境では、APIをより手軽に使えるようなライブラリが用意されている場合が多いです。Visual C++ には、MFC と呼ばれるものがあります。
((3)のCConsole も、そのサイトの記述者が独自に作成した、「APIをより簡単に使うためのライブラリ」でしょうね。)

MFC などのクラスライブラリを使えば、素のAPIを使うより簡単にプログラムを組めるので、
C++ Windows のプログラムを組む場合は、MFC を使う方がいいでしょう。
ただし、MFC は Windows API を C++ にしただけなので、Windows API の知識があった方が、より MFC の理解がしやすいです。そういう点では、MFCを使う場合でもWindows API の勉強をするのは悪くないと思います。

投稿日時 - 2009-03-25 23:10:25

お礼

余裕があればMFCも取り入れてみたいと思います。
しかし、Windows APIの知識があったほうがより理解しやすいとのことなので、まずはAPIから触れてみようと思います。
回答ありがとうございました。

投稿日時 - 2009-03-26 01:15:37

ANo.2

 こんばんは。

(1)windows側が提供している関数の事です。

(2)実行出来る筈です。其のままで実行できないのはwin32コンソールアプリケーションの方ではないでしょうか。
 実行出来なかった方で、以下の様にして見ては如何でしょう。

int main(void)
{
MessageBox(NULL , TEXT("Hello Wold!"), TEXT("メッセージボックス") , MB_OK);
return 0;
}

(3)コンソールウィンドウと言うのはwin32コンソールアプリケーションで出てくる黒いウィンドウの事です(着色出来る見たいです)。
 当方は殆ど使用した事が無いのですが、コンソールAPIはコンソールウィンドウに対して操作を仕掛ける為のAPIです。
 CConsoleと言うクラス自体は、そのサイトの人が書いたものだと思います。
 実際にクラス内でコンソールウィンドウに対してコンソールAPIで操作を仕掛けています。

(4)win32コンソールアプリケーションはprintf()やfread()/fwrite()と言った標準C言語関数を使用します。
 http://ja.wikipedia.org/wiki/%E6%A8%99%E6%BA%96C%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA

 但し、win32コンソールアプリケーションからでもCreateWindowEx()の様なAPIを呼び出して自前のウィンドウを開く事も出来ます。

 win32プロジェクトはwin32APIの塊であるウィンドウアプリケーションやDLL等を作成する時に選択されます。
 windowsフォームアプリケーションは買った書籍の通りVisualC++.NETの事です。C++/CLIと言う言語で扱います。
 何れもwin32APIを使用する事が可能です。

(5)あると思います。結局の所、ウィンドウを広げる事は宿命の様な物です。

(6)ウィンドウ関連、描画関連辺りでしょうかねぇ。

・VisualC++.NET逆引き大全500の極意
 此れと同系列でVisualC++逆引き大全500の極意と言う書籍が結構前に出ていました。win32APIに比重を入れている書籍です。

投稿日時 - 2009-03-25 22:48:39

お礼

(2)に関しては完全に勘違いです。おっしゃるとおり逆でした。すみません。
"標準Cライブラリ"で検索すればウィキペディアで詳しくのっているのですね。大変参考になり、助かりました。
VisualC++逆引き大全500の極意もちょっとみてみます。
回答ありがとうございました。

投稿日時 - 2009-03-26 01:06:38

ANo.1

(1)Windowsの関連機能を操作するために用意されたライブラリだと思ってください。自分は“Win32 API”と呼ぶことが多いです。
(2)ぱっと見た感じ、逆ではないですか?
(3)しなくてよいです。
(4)Win32としては同じものを使えます。
(5)マウス・キーボードの入力を受け取ったり、ディレクトリの操作を行ったり、処理を並列化したり等、特にGUIにしたい場合は必要不可欠なものです。実際、書ききれない程、多彩なものです。
(6)どういう機能を付加したいかによります。例えば、ファイルの削除が行いたいなら、“win32 ファイル操作”とかで検索して調べます。ヒットしたDeleteFileとかで再検索したりして用法も調べます。個人的には、ファイル操作あたりが簡単で調べ易いかと思います。基本的にMSDN ライブラリを使って調べますが、書店に沢山出版されている本を立ち読みして、どういう事が出来るのかを知る事が良いと思います。

最初は、一冊本を買って、興味あるものを真似て実装してを繰り返すのが近道です。

投稿日時 - 2009-03-25 22:29:09

お礼

(2)に関しては完全に勘違いです。おっしゃるとおり逆でした。すみません。
まずは本屋での立ち読みをして大まかなことを把握してみたいと思います。
回答ありがとうございました。

投稿日時 - 2009-03-26 01:04:16

あなたにオススメの質問