Nodachisoft Nodachi Sword Icon
  
@あまじ✎ 2021年3月12日に更新

第3章1 WindowsAPIを使う・sleep関数

イチからゲーム作りで覚えるC言語
第2章64 外部コマンド実行 : PREV
NEXT : 第3章2 コンソールサイズの変更 :

概要

C言語の標準仕様以外の関数を使用してみましょう!

今後もよく使う、Sleep 関数を例に、Windows 機能の呼出し型の基本を確認していきます。

今回は Windows 上で、指定した秒数の間、プログラムが処理を停止する関数を呼び出します。

Windows 固有の機能を呼び出すので、windows.h ヘッダをインクルードします。

WindowsAPI

Windows OS が提供する機能は公式では Windows API と呼ばれます。 APIとは application programming interface の略で、 なにかの機能を呼び出すときの関数の宣言みたいなものを指します。
今回確認していく Sleep関数も Windows API の一つです。

Win32API

Microsoft社も認識していることですが、 Windows API は長らく Win32API と呼ばれてきました。 長らく Windows 32bit の環境で利用できる仕様を保ち続けたためのようですが、 実際には 16bit から始まり、今では 32bit でも 64bit でも利用可能ですので、 Microsoft社公式では使うPCのビットを意識しない場合は Windows APIという呼び方で統一しているようです。

Sleep関数

早速、Windows API の一つである Sleep関数を使った例を確認していきます。

 
sleep_ex.c
#include <stdio.h>
#include <windows.h>
int main() {
   printf("6秒タイマー!\n");
   Sleep(1000 * 6);
   printf("PI, PI, PI~!\n");
}

実行すると下の結果になります。

結果
6秒タイマー!
PI, PI, PI~!

「6秒タイマー!」が表示されて6秒後に「PI, PI, PI~!」と表示されました。

5行目で新しい関数 Sleep が登場します。

使い方は下の通りです。

Sleep_usage
Sleep ( 停止するミリ秒 );

ミリ秒は 1000分の1 秒なので、 1000 * 6 ミリ秒は 6 秒です。

Windows API の関数仕様のかんたんな見方

WIndows API や WinAPI と呼ばれる、 Windows の機能を使うとき、 関数の使い方を自分で確認できるようになると、開発効率が上がります!

今回の Sleep 関数も WIndows API の一つですので、 実際に Sleep 関数がどのように宣言されているかを確認し、 利用するときの形式を把握していきましょう!

Sleep関数の定義

Sleep関数の定義は下のようになっており、windows.h の中の、さらに参照先で定義されています。

def_Sleep
WINBASEAPI VOID WINAPI Sleep (DWORD dwMilliseconds);

今までのC言語標準での関数では見かけなかった、様々な型や指定が含まれています。

なんだが関数の頭がごちゃごちゃしていますが、文法的には今までの関数宣言とそう変わりありません。

  1. WINBASEAPI の指定付き宣言
  2. 戻り値は VOID 型
  3. 呼出し規約は WINAPI 型
  4. 関数の名前は Sleep
  5. 関数の第一引数は DWORD 型

という 5 つの構成で宣言されています。一つ一つ見ていきましょう。

WINBASEAPI 指定

WINBASEAPI がついた関数は、使用する時は無視して大丈夫です。

補足程度ですが、WINBASEAPI 宣言がついた関数は、 Windows の機能(Win32API)が入ったライブラリである DLL ファイルを参照するときに付けます。

私の環境(WIn10+CYgwin+gcc)では「__declspec(dllimport)」を置き換えたものでした。

#define WINBASEAPI __declspec(dllimport)

VOID 型

全て大文字尾 void 型です。

そのまんま、void 型と意味は同じです。下のように定義されています。

winnt.h
#define VOID void
voidとVOID、intとINTなど

Windows OS の標準機能である Win32API を使用するときに、 int や float 、 void などは Microsoft 社独自の INT、FLOAT、VOID などの大文字型を代わりに使うことがおおいです。

これは、Windows の環境が 32bit や 64bit などで変わったとしても、 Microsoft 社側で INT の中身をちょうど必要とするビット数の整数に 書き換えるなど、対応できるようになっています。

WINAPI

Windows OS の機能(Windows API、略して WinAPI)を呼び出すときに付与する Microsoft社が定める識別子です。

WINAPI宣言
#define WINAPI __stdcall

DLLを自作したときは、呼び出すときに「__cdecl」という呼出し規約を指定していましたが、 Sleep を呼び出すときは「__stdcall」という呼出し規約を指定しています。

使う観点では、お決まりのキーワードとして「WINMAIN」を書くものだ、というだけでも問題ありません。

__stdcallと__cdeclの違い

通常の C や C++ で作成したプログラムの関数を呼び出すときは__cdeclを指定します。 違いとして、呼出した関数が使用するメモリ(スタック)の扱いがあげられます。 __cdecl 付きで呼び出したときは、 詳細は Microsoft 社の仕様をご確認ください。

DWORD型

Sleep関数の第一引数に DWORD 型が指定されています。

DWORD型宣言
typedef unsigned long DWORD;

DWORD型は数値を代入できる型の一つで、 私の環境では 符号なし long 型を置き換えたものでした。

この辺りは処理系によって、柔軟に windows.h の中で定義がかわり、 良い感じにコンパイルされる可能性があります。

覚えておいた方がよいのは、DWORD 型は Windows APIを呼び出すときによく使われる正の整数を扱う型、という点です。

こういった Microsoft社の仕様は公式のドキュメントで公開されているので、 ナゾな型が登場してきたら、調べてみるとすっきりします。

例として DWORD 型の Microsoft社の仕様はこちらです。

Sleep関数利用時に意識すること

通常の関数利用時のように、 関数を使うときは下のように見てあげればわかりやすくなります。

宣言
VOID Sleep (DWORD dwMilliseconds);

戻り値は VOID ですので、ただ呼び出すだけ。 第一引数は DWORD 型ですので、正の整数を渡してあげれば、暗黙的にキャストされます。

使う形式
Sleep ( 数字 );

という形式で利用できそう、ということが宣言からわかります。

参考文献

イチからゲーム作りで覚えるC言語
第2章64 外部コマンド実行 : PREV
NEXT : 第3章2 コンソールサイズの変更 :
 
 
送信しました!

コメント、ありがとうございます。

なんかエラーでした

ごめんなさい。エラーでうまく送信できませんでした。ご迷惑をおかけします。しばらくおいてから再度送信を試していただくか、以下から DM などでご連絡頂ければと思います。

Twitter:@NodachiSoft_jp
お名前:
 
連絡先:
 
メッセージ:
 
戻る
内容の確認!

以下の内容でコメントを送信します。よろしければ、「送信」を押してください。修正する場合は「戻る」を押してください

お名前:
 
連絡先:
 
メッセージ:
 
Roboto からの操作ではないという確認のため確認キーを入れてください。
確認キー=95
戻る
 / 
送信確認へ
コメント欄
コメント送信確認へ

関連ありそうな記事(5件)です!

第1章01 Visual Studio Community 2019 のインストール手順

#C11仕様#C言語#ゲームプログラミング✎ 2021-08-08
C言語でプログラミングをするために、無料で使える Visual Studio Community を使った開発環境を揃えていく手順や注意点をお話しています。
目次
第3章1 WindowsAPIを使う・sleep関数
第3章1 WindowsAPIを使う・sleep関数
概要
概要
Sleep関数
Sleep関数
Windows API の関数仕様のかんたんな見方
Windows API の関数仕様のかんたんな見方
Sleep関数の定義
Sleep関数の定義
WINBASEAPI 指定
WINBASEAPI 指定
VOID 型
VOID 型
WINAPI
WINAPI
DWORD型
DWORD型
Sleep関数利用時に意識すること
Sleep関数利用時に意識すること
参考文献
参考文献
Nodachisoft © 2021