Saturday, December 29, 2007

1.猫はWindowsプログラミングがわからん

DDL:Dynamic Link Library
WindowsシステムのAPI関数の実際の実行コードはgdi32.dllやkernel32.dllやuser32.dllに含まれている.

メッセージ駆動型プログラミング:プログラムはシステムからどのようなメッセージが送られてきたら何をすれば指定するプログラミング
イベント駆動型プログラミング:どのイベントが発生したら何を実行するか?

Win32APIで使われているデータ型:

データ型 意味
BOOL True or False
BYTE バイト(8ビットデータ)
CHAR 8ビットANSIキャラクタ
DWORD 32ビット符号なし整数
INT 32ビット符号付きの整数
LONG 32ビット符号付きの整数
WORD 16ビット符号なし整数

基本的なWindowsプログラムであれば,多くの場合,結合するライブラリを指定しなくてもリンカが自動でやってくれる.しかしツールバーやステータスバーなどを持つプログラムは特別にライブラリを指定する必要がある.

メニューやダイヤボックス(これらはリソースという)を持つプログラムでははリソーススクリプトを作成して,リソースコンパイラでコンパイルし,リンカで結合する必要がある.

WindowsプログラムはWinMain関数から出発.
CALLBACK修飾子が付いている関数は自分のプログラムにどの場所に出てこないこともあるが,これはシステムから呼ばれるものである.コールバック関数あるいはウィンドウプロシージャという.

int WINAPI WinMain(HINSTANCE hCurInst,
HINSTANCE hPrevInst,
LPSTR lpsCmdLine, int nCmdShow)

HINSTANCE:インスタンスハンドルと呼ばれ,インスタンスとはメモリ上のプログラムのこと.インスタンスハンドルはシステムがインスタンスを識別するための番号です.
hCurInst: Current instance
hPrevInst: Previous instance.Windowsでは同じプログラムを複数起動できる.16ビット時代はこの引数を見て,すでに自分自身が起動されているかどうかを知ることができたが,Win32 APでは常にNULL.互換性維持のため,無視してよし.

LPSTR lpsCmdLine
コマンドライン引数が格納される.ARGV...と同じ

int nCmdShow
ウィンドウの表示状態を指定する.WinMain開始,システムが表示状態を決定する(?),そのままメインウィンドウを作った後
ShowWindow(hWnd, nCmdShow);

WinMain関数の中身:

  • ウィンドウクラスの定義
  • ウィンドウクラスの登録
  • 登録したウィンドウクラスを元に,親ウィンドウを作成
  • メッセージループの作成

自分で作ったウィンドウに対してはウィンドウプロシージャと呼ばれる関数が必要.複数のウィンドウに対して同じウィンドウプロシージャを使うことができる.

実はWinMain関数はどのようなプログラムもほとんど同じ.プログラムのメインの部分はウィンドウプロシージャにある.ここでイベントが起きたときのプログラムの反応を書くからである.イベントが起きるとメッセージが届く.メッセージ処理ということになる.

その1.

Wednesday, December 12, 2007

C言語のポインタ

Source: http://www.geocities.co.jp/ky_webid/c/030.html
C言語のポインタを書くときいくつかの注意点(間違いやすい点)がある.上のページはいくつかの注意点を書いてある.以下にまとめる.

  • C言語では配列自体を引数にできないというのはC言語のルールこのときポインタを利用する
    仮引数に限っては配列とポインタは同じように宣言できる
    例:
    dispArray(int array[]);
  • 結果を受け取るためにポインタを渡す
    ポインタを引数にすれば結果をそのアドレスにある変数へ格納させることができる
    2つ以上の戻り値がほしいときポインタを利用する.返してほしいデータの個数分だけポインタを引数として渡し,結果をそのアドレスに入れてもらう.
  • 戻り値にポインタを使うときに注意が必要.関数のローカルアドレスを返してはならない.


例:(間違ったプログラム)


#include

char *getstring(void);

int main(void)
{
char *p;

p = getstring();
puts( p ); /* 受け取った文字列を出力 */

return 0;
}

/* 80文字以内の文字列を入力させ、その文字列のアドレスを返す */
char *getstring(void)
{
char str[81];

puts( "80文字以内の文字列を入力して下さい" );
fgets( str, 81, stdin );

return str;
}