C言語 基本講座

BACK

 

 参考書

  • 初めてのC言語
  • 独習C ハーバートシルト 著
  • 最速C/C++入門教室
 開発ツール
  • MicroSoft Visual C++ 6.0  
  • Borlande C++ Builder 4  Professional  使いづらいツールでお勧めできない
 学習項目

C言語の基礎知識

  • プログラムとは何か
  • プログラム言語
  • コンパイルリンク
  • プログラミングの流れ
  • C言語の特徴
  • C言語を利用する環境
  • ソースプログラムの作成手順

C言語の基本

  • 一番短いプログラム
  • 文字を表示するプログラム
  • 制御文字
  • 数値を表示するプログラム
  • 文字と文字列の表示

データ型と変数、数値処理

  • 変数とデータ型
  • 変数の利用宣言
  • データ型と変換文字列
  • 変換文字列のまとめ
  • 算術演算子
  • 型変換
  • 代入と代入演算子
  • インクリメント演算子

配列処理

  • 配列
  • 配列で数値を扱う
  • 配列で文字を扱う
  • 二次元配列
  • 二次元配列で文字を扱う

データの入力

  • scanf関数を使った入力
  • scanf関数の応用
  • scanf関数の注意点
  • 一文字の入力
  • 文字列の入出力

 

条件判断と繰り返し

  • if 文
  • else 文
  • 比較演算子と論理演算子
  • switch文
  • while文
  • do while文
  • for 文
  • break文とcontinue文

文字列処理関数

  • 文字列の取り扱いの復習
  • 文字列の連結文字列の長さ
  • 文字列の検索と比較
  • 文字列処理関数の使い方

関数

  • 関数とは
  • 返り値のある関数
  • 返り値のない関数

ファイル処理

  • ファイルを扱うには
  • ファイル操作の実例

プログラムを書いてみよう

  • 基本的なプログラムの作成
  • エラーを回避する
  • 関数に分割してみる

ステップアップのために

  • ポインタ
  • 配列とポインタ
  • アドレス渡しのの関数
  • コマンドライン引数
  • 記憶クラス
  • プリプロセッサ
  • 構造体
■ コメント
  • プログラムの学習をはじめるだんだんと疑問点が多くなり、最終的にはC言語に戻らなくてはならない、それほど大切な言語です。
  • この言語以下の言語はないので全てがC言語に収斂すると思います。
 サンプル
この講座でのプログラムはこの程度の極めて簡単なものです。

#include <stdio.h>

int func(int x,int y);

main(){

    int a,b,c;

    printf("べき乗を計算するプログラム\n\n");

    printf("数?\n\n");

    scanf("%d",&a);

    printf("何乗?\n\n");

    scanf("%d",&b);

    for(i=0;i<=b;i++){

        c=func(a,i);

        printf("%dの%d乗-->%d\n",a,i,c);

}

int func(int x,int y){

    int i,ans=1;

    for(i=1;i<=y;i++){

        ans=ans*x;

    }

        return ans;

}

 

 


C言語 発展講座

 

 参考書

  • 独習C改訂版 ハーバートシルト著

 開発ツール
  • MicroSoft Visual C++ 6.0  
  • Borlande C++ Builder 4  Professional  使いづらいツールでお勧めできない
 学習項目
  • Cの基礎知識
  • 制御文
  • データ型、変数、式の詳細
  • 配列と文字列
  • ポインタ
  • 関数
  • コンソールI/O
  • ファイル入出力
  • 構造体と共用体
  • 高度なデータ型と演算子
  • Cのプリプロセッサ

 

■ コメント
  • ハーバートシルトの書いた本はじっくり読みたくなるような本だと思います。

 

 


C++ 基本講座

 

 参考書

  • 初めてのC++ 技術評論社
  • 最速C/C++入門教室
 開発ツール
  • MicroSoft Visual C++ 6.0  
  • Borlande C++ Builder 4  Professional  使いづらいツールでお勧めできない
 学習項目
書式の慣例
  • トークン
  • 自由書式
  • 書式の慣習
  • コメント

ストリームI/O

  • cout
  • ストリームI/O
  • マニュピレータ

演算とデータ型

  • 数値の出力
  • 四則演算子
  • いろいろなデータ型

標準出力

  • いろいろな出力
  • 条件コンパイル

変数

  • 16進変換プログラム
  • 変数
  • sizeof

標準入力

  • cin
  • 演算子の多重定義
  • サンプルプログラム

選択文if

  • 基本三構造
  • 場合分け
  • 条件式
  • 結果が真 偽になる演算
  • ブロック
  • 代入式

高度な選択文

  • 3つ以上の場合分け
  • if文のネスト
  • 三項演算子

反復文

  • インクリメント デクリメント
  • while
  • 定数
  • do while
  • for
  • ループ変数の利用

関数

  • 関数定義
  • 関数参照
  • 関数のプロトタイプ宣言
  • 何故関数をと買うのか
  • 関数値
  • インライン関数

引数

  • 引数
  • デフォルト引数
  • 関数の多重定義

スコープ

  • ローカル変数
  • グローバル変数

配列

  • 基本型とユーザー定義型
  • 使い方の基本
  • 定石
  • 応用

 

ポインタ
  • アドレス
  • ポインタの基礎
  • 参照引数
  • ポインタと配列

ポインタと配列

  • 配列名とアドレス
  • ポインタの演算
  • 配列要素の参照
  • ポインタと配列の相互作用
  • 配列とポインタの違い
  • 配列引数

文字列

  • 文字列変数
  • 文字の配列
  • 文字配列の初期化
  • 文字へのポインタ
  • 文字列引数と文字列関数値
  • 文字列関数

クラス

  • クラスの実態
  • クラスの宣言
  • クラスの利用
  • メンバー変数の参照
  • 顧客クラス

アクセス制御

  • 顧客クラス第2版
  • 拡張に強いクラス
  • メンバー関数
  • アクセス制御
  • インラインメンバー関数

コンストラクタ デストラクタ

  • オブジェクトの初期化
  • コンストラクタ
  • コンストラクタの多重定義
  • デフォルトコンストラクタ
  • デストラクタ

継承

  • 継承
  • privateな継承
  • publicな継承
  • アクセス制御と継承修飾
  • メンバー関数のオーバーロード
  • 継承とコンストラクタ

多態性

  • オブジェクトとポインタ
  • オブジェクトの代入互換性
  • 仮想GUIプログラミング
  • 列挙型
  • 仮想関数
  • 多態性
  • 純粋仮想関数と抽象クラス

動的変数

  • 動的変数
  • 基本型への適用
  • 配列への適用

動的オブジェクト

  • 動的オブジェクト
  • コンストラクタとデストラクタ
  • 引数つきのコンストラクタ
  • コンポジション

演算子の多重定義

  • クラスの代入
  • 二項演算子の多重定義
  • フレンド関数
  • 単項演算子の多重定義
■ コメント
  • C言語を発展させ、オブジェクト指向を取り入れた言語です。
  • マイクロソフトのMFCを利用してプログラムを作成するのに必要となる言語でもあります。
  • Windowsプログラムを能率的作成するにはC++のマスターが必須です。今流行のオブジェクト指向言語が如何なるものか理解できると思います。しかし、オブジェクト指向言語が如何なるものかを理解するにはC++で学習するより、Javaで学習すればすんなりと理解できると思います。

 


 

MFC 入門講座

 

 参考書

  • 標準講座MFC6.0 ハーバートシルト著

 開発ツール
  •   MicroSoft Visual C++ 6.0
 学習項目
  • MFCとWindows
  • MFCの基礎
  • メッセージ処理
  • メッセージボックスとメニュー
  • ダイアログボックス
  • その他のコントロール
  • アイコン、カーソル、ビットマップ
  • テキスト処理と再描画問題の解決
  • グラフィック処理
  • スレッドによるマルチタスク

 

■ コメント
  • Microsoft Foundation Class(MFC) はWindowsプログラムを簡単にしかも移植性の高いものにするために開発されました。APIベースでWindowsプログラムを書くことは煩雑で、実際にプログラムを作るにはVisualC++を使用すればサイズの小さい安定したコードをより早く簡単に作成することができます。しかしVisualC++はどのように動作しているのか、VisualC++の操作方法を習得しても理解できない、MFCを知らなければいけないのです。MFCを知るにはC++を知らなくてはならない、C++を知るにはCを知らなくてはならない。つまりCからC++、C++からMFC、MFCからVisualC++に発展しているのであるから、MFCはVisualC++の基礎になっているのです。
  • VisualC++がSDIプログラム作成時に自動的に作り出すファイルはびっくりするほど多くこのファイルだけを眺めていても何がどうなっているのかわからない。たとえC++の知識があってもである。ここで重要な橋渡しをするのがMFCで特に標準講座MFC6.0 ハーバートシルト著はVisualC++動作原理の理解に大きな助けになる。目から鱗が落ちる本です。

 

 


Windowsプログラミングの基礎講座

 

 参考書

  • プログラミング学習シリーズ Visual C++ @ 山本信雄著 わかりやすく書かれた本だと思います。お勧めの1冊。
 開発ツール
  • Microsoft Visual C++ 6.0
 学習項目
API
  • APIの概要
  • APIを使ったWindowsプログラムの作成手順
  • エントリーポイントとヘッダーファイル

メッセージ

  • メッセージの役割と種類
  • Windowsプログラムの構造

文字列とグラフィックス

  • 描画の仕組み
  • クライアント領域への描画

キー入力

  • キー入力メッセージ
  • キー入力メッセージの処理
マウス入力
  • マウス入力メッセージ
  • マウス入力プログラムの作成

リソース

  • リソース
  • メニュー

コントロールとダイアログボックス

  • コントロール
  • ダイアログボックスの作成

AppWizard

  • AppWizard
  • DLL
■ コメント
  • この講座を理解すれば、ウインドウズがどのように動いているかよく解ると思います。
  • Windowsプログラミングの基礎になる講座です。

 

 サンプル
#include <windows.h>

LRESULT CALLBACK WindowFunc(HWND, UINT, WPARAM, LPARAM);
char szWinName[] = "MyWin"; /* ウィンドウクラスの名前 */


int WINAPI WinMain(HINSTANCE hThisInst, HINSTANCE hPrevInst,
                   LPSTR lpszArgs, int nWinMode)
{
  HWND hwnd;
  MSG msg;
  WNDCLASSEX wcl;  /* ウィンドウクラスを定義する */
  wcl.cbSize = sizeof(WNDCLASSEX);   wcl.hInstance = hThisInst;     /* このインスタンスのハンドル */
  wcl.lpszClassName = szWinName; /* ウィンドウクラスの名前 */
  wcl.lpfnWndProc = WindowFunc;  /* ウィンドウ関数 */
  wcl.style = 0;                 /* デフォルトのスタイル */  wcl.hIcon = LoadIcon(NULL, IDI_APPLICATION); /* 標準アイコン */
  wcl.hIconSm = LoadIcon(NULL, IDI_WINLOGO);   /* 小さいアイコン */
  wcl.hCursor = LoadCursor(NULL, IDC_ARROW);   /* カーソルのスタイル */  wcl.lpszMenuName = NULL;       /* メニューを使用しない */
  wcl.cbClsExtra = 0;            /* そのほかの情報は必要ない */
  wcl.cbWndExtra = 0;            /* そのほかの情報は必要ない */  /* ウィンドウの背景を白にする */
  wcl.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);   /* ウィンドウクラスを登録する */
  if(!RegisterClassEx(&wcl)) return 0;  /* ウィンドウクラスを登録したので、ウィンドウを作成できる */
  hwnd = CreateWindow(
    szWinName,             /* ウィンドウクラスの名前 */
    "Windows 98 Skeleton", /* タイトル */
    WS_OVERLAPPEDWINDOW,   /* ウィンドウスタイル - 標準 */
    CW_USEDEFAULT, /* X座標 - Windowsに決めさせる */
    CW_USEDEFAULT, /* Y座標 - Windowsに決めさせる */
    CW_USEDEFAULT, /* 幅 - Windowsに決めさせる */
    CW_USEDEFAULT, /* 高さ - Windowsに決めさせる */
    HWND_DESKTOP,  /* 親ウィンドウはない */
    NULL,          /* メニューを使用しない */
    hThisInst,     /* プログラムのこのインスタンスのハンドル */
    NULL           /* このほかの引数は必要ない */
  );  /* ウィンドウを表示する */
  ShowWindow(hwnd, nWinMode);
  UpdateWindow(hwnd);  /* メッセージループを作成する */
  while(GetMessage(&msg, NULL, 0, 0))
  {
    TranslateMessage(&msg);  /* キーボードメッセージを変換する */
    DispatchMessage(&msg);   /* Windows 98に制御を返す */
  }
  return msg.wParam;
}/* この関数はWindows 98によって呼び出され、
   メッセージキューからメッセージを受け取る
*/
LRESULT CALLBACK WindowFunc(HWND hwnd, UINT message,
                            WPARAM wParam, LPARAM lParam)
{
  switch(message) {
    case WM_DESTROY: /* プログラムを終了する */
      PostQuitMessage(0);
      break;
    default:
      /* 上記のswitchステートメントで指定していない
         メッセージは、Windows 98に処理させる */
      return DefWindowProc(hwnd, message, wParam, lParam);
  }
  return 0;
}

最小のプログラムがこれです。

    
    
      

BACK


Windowsプログラミング発展講座

 

 参考書

  • Windows98 プログラミング Herbert Schildt著 
  • Visual C++6.0 の応用50例 田中ひろゆき著
 開発ツール
  • Microsoft Visual C++ 6.0
 学習項目
マルチタスク
  • スレッドの基礎  
  • スレッド関数
  • スレッドの停止と再開 
  • スレッドの優先順位  
  • シンクロナイズ
  • セマファによるスレッドのシンクロナイズ
  • イベントオブジェクトによるスレッドのシンクロナイズ    

システムレジストリ

  • レジストリの基礎
  • 値を格納する
  • 値を取得する
  • REGEDITを使用する
  • スクリーンセーバーを作成する
インターネット
  • gethostbynameの使用法
  • 電子メールの送信
  • 電子メールの受信
  • InternetAPIによるFTP転送
  • CInternetSessionを使って指定URLのファイルをダウンロードする
  • CFtpConnectionを使って指定したサーバー上のファイルをローカルに転送する
  • CFtpFileFindを使ってサーバー上のファイルの一覧を得る
  • CHttpConnectionを使ってHTMLファイルを転送する
  • スレッドを利用してサーバー上のデータ(たとえば東証全銘柄の株価データ)をダウンロードし加工の後テキスト形式で保存しアクセスに読み込むプログラムの作成する

 

 

■ コメント
Win32 SDK, MFC を用いてプログラムを作成します。

 

BACK


 

Visual C++ 入門講座

 

 参考書

  • 新Visual C++6.0入門 スーパービギナー編
  • 新Visual C++6.0入門 ビギナー編
  • 新Visual C++6.0入門 シニア編
 開発ツール
  • Microsoft Visual C++ 6.0
 学習項目
新Visual C++6.0入門 スーパービギナー編
  • Visual C++とはどんな言語か
  • Visual C++による開発手法を知る
  • Visual  C++の基本操作を覚えよう
  • ヘルプ操作を覚えよう
  • SDI型プログラムを作る
  • マウス操作をするプログラムを作る
  • ダイアログベースのプログラムを作る
  • OK,CANCELボタンを利用するプログラムを作る
  • Visual C++プログラムの構造を知る
  • 画像を表示するプログラムを作る
  • 描画を行うプログラムを作る
  • プログラムのデバックを行う
  • いろいろなプログラムを作ってみよう
新Visual C++6.0入門 シニア編
  • 単純データ型クラスを使う
  • 文字出力を行う
  • DDX変数とDDV機能
  • アニメコントロールを使う
  • プログレスバーを使う
  • チェックボックスとラジオボタンを使う
  • リストボックスを使う
  • コンボボックスを使う
  • ダイアログのOK/CANCELボタンを処理する
  • エディットボックスを使う
  • ファイルダイアログを使う
  • カラーダイアログを使う
  • フォントダイアログを使う
  • 検索置換ダイアログを使う
  • コントロールをコードで配置する
  • IPアドレスコントロールを使う
  • ホットキーコントロールを使う
  • クラスに独自のメンバーを追加する
  • 画像データをピクチャーボックスに表示する
  • キー入力処理をする
  • マウスを処理する
  • コントロールの色を指定する
  • ウインドウサイズを変更する
  • タイマーを処理する
  • リソースによるHelloを表示する
  • SendMessage関数を使う
  • 外部プログラムを実行する
  • ウェブブラウザを実行する
  • レジストリーを操作する
  • Waveファイルを再生する
  • 例外処理をする

 

■ コメント
  • C 、更にC++ 、更にMFCを段階的に、理解したのちに取り組まないと、このVisual C++は何がなんだかさっぱりわからない。というのも、ウイザードによるスケルトン作成でさえファイル数19もある。開発効率は優れていると言われているが、私は今のところなんともいえない。

 

BACK

 


 

 

SetThreadPriority

 

 サンプル
//グローバルで宣言
#include <string.h>
#include <stdio.h>
#define MAX 50000
char str[255]; 
DWORD Tid1, Tid2;
HANDLE hThread1,hThread2;
//HANDLE Handle to an object.  
DWORD WINAPI MyThread1(LPVOID param)
{
  int i;  
  HDC hdc;
  for(i=0; i<MAX; i++) {
	sprintf(str, "Thread 1: loop # %5d ", i);
    hdc = GetDC((HWND) param);
    TextOut(hdc, 1, 1, str, strlen(str));
    ReleaseDC((HWND) param, hdc);
  }
  return 0;
}
DWORD WINAPI MyThread2(LPVOID param)
{
  int i;
  HDC hdc;
  for(i=0; i<MAX; i++) {
	sprintf(str, "Thread 2: loop # %5d ", i);
    hdc = GetDC((HWND) param);
    TextOut(hdc, 1, 20, str, strlen(str));
    ReleaseDC((HWND) param, hdc);
  }
  return 0;
}
//////////////////////////////////////////////////////////////
		case WM_LBUTTONDOWN:
          		hThread1=CreateThread(NULL, 0,
			(LPTHREAD_START_ROUTINE)MyThread1, 
                       (LPVOID) hWnd, 0, &Tid1);
          		hThread2=CreateThread(NULL, 0,
                       (LPTHREAD_START_ROUTINE)MyThread2, 
                       (LPVOID) hWnd, 0, &Tid2);
 		break;
/*
Return Values
If the function succeeds, the return value is a handle to the new thread.
If the function fails, the return value is NULL. */
		case WM_RBUTTONDOWN:
          		SetThreadPriority(hThread1,THREAD_PRIORITY_HIGHEST);
		  	SetThreadPriority(hThread1,THREAD_PRIORITY_LOWEST);		
 		break;
/*
SetThreadPriority
The SetThreadPriority function sets the priority value for
 the specified thread.
 This value, together with the priority class of the thread's process,
 determines the thread's base priority level. 
BOOL SetThreadPriority(
  HANDLE hThread, // handle to the thread
  int nPriority   // thread priority level
);*/

 

 


 

 

CreateThread

 

 サンプル
//グローバルで宣言
#include <string.h>
#include <stdio.h>
#define MAX 50000
char str[255]; 
DWORD Tid1, Tid2;
//DWORD 32-bit unsigned integer.  
DWORD WINAPI MyThread1(LPVOID param)
{
//LPVOID   型指定のない 32 ビット ポインタ
  int i;  
  HDC hdc;
  for(i=0; i<MAX; i++) {
	sprintf(str, "Thread 1: loop # %5d ", i);
    hdc = GetDC((HWND) param);
    TextOut(hdc, 1, 1, str, strlen(str));
    ReleaseDC((HWND) param, hdc);
  }
  return 0;
}
DWORD WINAPI MyThread2(LPVOID param)
{
  int i;
  HDC hdc;
  for(i=0; i<MAX; i++) {
	sprintf(str, "Thread 2: loop # %5d ", i);
    hdc = GetDC((HWND) param);
    TextOut(hdc, 1, 20, str, strlen(str));
    ReleaseDC((HWND) param, hdc);
  }
  return 0;
}
/////////////////////////////////////////////////////////////////////////////////
case WM_LBUTTONDOWN:
          CreateThread(NULL, 0,
			(LPTHREAD_START_ROUTINE)MyThread1, 
                       (LPVOID) hWnd, 0, &Tid1);
          CreateThread(NULL, 0,
                       (LPTHREAD_START_ROUTINE)MyThread2, 
                       (LPVOID) hWnd, 0, &Tid2);
 		break;
/*
CreateThread
スレッドを作成します。スレッドは、呼び出し側プロセスのアドレス空間で実行されます。
HANDLE CreateThread(
  LPSECURITY_ATTRIBUTES lpThreadAttributes,
                          // pointer to thread security attributes
  DWORD dwStackSize, // initial thread stack size, in bytes
  LPTHREAD_START_ROUTINE lpStartAddress,
                          // pointer to thread function
  LPVOID lpParameter, // argument for new thread
  DWORD dwCreationFlags, // creation flags
  LPDWORD lpThreadId // pointer to returned thread identifier
);
LPDWORD Pointer to a DWORD		  */ 

 

 

 


 

CreateEvent

 

 サンプル
// THREAD.C
/* マルチスレッドの使用例 */
#include <windows.h>
#include <string.h>
#include <stdio.h>
#define MAX 100000
LRESULT CALLBACK WindowFunc(HWND, UINT, WPARAM, LPARAM);
DWORD WINAPI MyThread1(LPVOID param);
DWORD WINAPI MyThread2(LPVOID param);
char szWinName[] = "MyWin"; /* ウィンドウクラスの名前 */
char str[255];    /* 出力文字列を保持する */
DWORD Tid1, Tid2; /* スレッドのID */
HANDLE hThread1,hThread2;
HANDLE hEvent;
int WINAPI WinMain(HINSTANCE hThisInst, HINSTANCE hPrevInst, 
                   LPSTR lpszArgs, int nWinMode)
{
  HWND hwnd;
  MSG msg;
  WNDCLASSEX wcl;
  HACCEL hAccel;
  /* ウィンドウクラスを定義する */
  wcl.cbSize = sizeof(WNDCLASSEX); 
  wcl.hInstance = hThisInst;     /* このインスタンスのハンドル */
  wcl.lpszClassName = szWinName; /* ウィンドウクラスの名前 */
  wcl.lpfnWndProc = WindowFunc;  /* ウィンドウ関数 */
  wcl.style = 0; /* デフォルトのスタイル */
  wcl.hIcon = LoadIcon(NULL, IDI_APPLICATION);   /* 標準アイコン */
  wcl.hIconSm = LoadIcon(NULL, IDI_APPLICATION); /* 小さいアイコン */
  wcl.hCursor = LoadCursor(NULL, IDC_ARROW);     /* カーソルのスタイル */
  wcl.lpszMenuName = NULL; /* メインメニュー */
  wcl.cbClsExtra = 0; /* その他の情報は必要ない */
  wcl.cbWndExtra = 0; /* その他の情報は必要ない */
  /* ウィンドウの背景を白にする */
  wcl.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH); 
  /* ウィンドウクラスを登録する */
  if(!RegisterClassEx(&wcl)) return 0;
  /* ウィンドウクラスを登録したので、ウィンドウを作成できる */
  hwnd = CreateWindow(
    szWinName, /* ウィンドウクラスの名前 */
    "Demonstrate Threads", /* タイトル */
    WS_OVERLAPPEDWINDOW,   /* ウィンドウスタイル - 標準 */
    CW_USEDEFAULT, /* X座標 - Windowsに決めさせる */
    CW_USEDEFAULT, /* Y座標 - Windowsに決めさせる */
    CW_USEDEFAULT, /* 幅 - Windowsに決めさせる */
    CW_USEDEFAULT, /* 高さ - Windowsに決めさせる */
    HWND_DESKTOP,  /* 親ウィンドウはない */
    NULL,      /* ウィンドウクラスメニューを上書きしない */
    hThisInst, /* プログラムのこのインスタンスのハンドル */
    NULL       /* このほかの引数は必要ない */
  );
  
  /* ウィンドウを表示する */
  ShowWindow(hwnd, nWinMode);
  UpdateWindow(hwnd);
  /* メッセージループを作成する */
  while(GetMessage(&msg, NULL, 0, 0))
  {
    if(!TranslateAccelerator(hwnd, hAccel, &msg)) {
      TranslateMessage(&msg); /* キーボードメッセージを変換する */
      DispatchMessage(&msg);  /* Windows 98に制御を返す */
    }
  }
  return msg.wParam;
}
/* この関数はWindows 98によって呼び出され、
   メッセージ待ち行列からメッセージを受け取る
*/
LRESULT CALLBACK WindowFunc(HWND hwnd, UINT message,
                            WPARAM wParam, LPARAM lParam)
{
  
  switch(message) {
    case WM_CREATE:
		hEvent=CreateEvent(NULL,FALSE,FALSE,NULL);
		break;
	case WM_LBUTTONDOWN: /* プログラムを終了する */
		  hThread1=CreateThread(NULL, 0,
                       (LPTHREAD_START_ROUTINE)MyThread1, 
                       (LPVOID) hwnd, 0, &Tid1);
          hThread2=CreateThread(NULL, 0,
                       (LPTHREAD_START_ROUTINE)MyThread2, 
                       (LPVOID) hwnd, 0, &Tid2);
      
      break;	
    case WM_DESTROY: /* プログラムを終了する */
      PostQuitMessage(0);
      break;
    default: 
     /* 上記のswitchステートメントで指定していない
     メッセージは、Windows 98に処理させる */
     return DefWindowProc(hwnd, message, wParam, lParam);
  }
  return 0;
}
/* プロセス内の1つのスレッド */
DWORD WINAPI MyThread1(LPVOID param)
{
  int i;  
  HDC hdc;
  /* アクセスが許可されるのを待つ */
  if(WaitForSingleObject(hEvent, 10000)==WAIT_TIMEOUT) {
     MessageBox((HWND)param, "Time Out Thread 1",
                "Event Error", MB_OK);
     return 0;
  }
  for(i=0; i<MAX; i++) {  
 
	sprintf(str, "Thread 1: loop # %5d ", i);
    hdc = GetDC((HWND) param);
    TextOut(hdc, 1, 1, str, strlen(str));
    ReleaseDC((HWND) param, hdc);
  }
 
  return 0;
}
/* プロセス内のもう1つのスレッド */
DWORD WINAPI MyThread2(LPVOID param)
{
  int i;
  HDC hdc;
  for(i=0; i<MAX; i++) {
	sprintf(str, "Thread 2: loop # %5d ", i);
    hdc = GetDC((HWND) param);
    TextOut(hdc, 1, 20, str, strlen(str));
    ReleaseDC((HWND) param, hdc);
  }
	SetEvent(hEvent);
  return 0;
}

 

 

 


 

 

RegCreateKeyEx

 

 サンプル
case WM_LBUTTONDOWN:
		HKEY hRegKey;
		unsigned long result;
		RegCreateKeyEx(HKEY_CURRENT_USER,"Software\\watabe\\Calc",0,
			"Calculator1",0,KEY_ALL_ACCESS,NULL,&hRegKey,&result);
/*
RegCreateKeyEx
The RegCreateKeyEx function creates the specified key. 
If the key already exists in the registry, the function opens it.
LONG RegCreateKeyEx(
  HKEY hKey,                // handle to an open key
  LPCTSTR lpSubKey,         // address of subkey name
  DWORD Reserved,           // reserved
  LPTSTR lpClass,           // address of class string
  DWORD dwOptions,          // special options flag
  REGSAM samDesired,        // desired security access
  LPSECURITY_ATTRIBUTES lpSecurityAttributes,
                            // address of key security structure
  PHKEY phkResult,          // address of buffer for opened handle
  LPDWORD lpdwDisposition   // address of disposition value buffer
);
lpClass 
Pointer to a null-terminated string that specifies the class (object type) 
of this key. This parameter is ignored if the key already exists.
この値は作成するキーに対してだけ使われるもので、好みの文字を使用できる。 
lpdwDisposition
DWORD 型の変数へのポインタを指定します。この変数に、
次に示す処理結果が格納されます。
REG_CREATED_NEW_KEY キーが存在しなかったため、新しく作成されました。 
REG_OPENED_EXISTING_KEY キーが存在しており、オープンされました。 
		*/ 
//キーが作成された場合
		if(result==REG_CREATED_NEW_KEY){
			long value=123;
			RegSetValueEx(hRegKey,"reged value",0,REG_DWORD,(LPBYTE)&value,
				sizeof(DWORD));
/*
RegSetValueEx
The RegSetValueEx function sets the data and 
type of a specified value under a registry key. 
LONG RegSetValueEx(
  HKEY hKey,           // handle to key to set value for
  LPCTSTR lpValueName, // name of the value to set
  DWORD Reserved,      // reserved
  DWORD dwType,        // flag for value type
  CONST BYTE *lpData,  // address of value data
  DWORD cbData         // size of value data
);*/
		}
//キーがすでに存在していた場合
		else{
			unsigned long datatype,datasize;
			datasize=sizeof(DWORD);
			long value;
			RegQueryValueEx(hRegKey,"reged value",NULL,&datatype,
			(LPBYTE)&value,&datasize);
/*
RegQueryValueEx
The RegQueryValueEx function retrieves the type and data for 
a specified value name associated with an open registry key. 
LONG RegQueryValueEx(
  HKEY hKey,           // handle to key to query
  LPTSTR lpValueName,  // address of name of value to query
  LPDWORD lpReserved,  // reserved
  LPDWORD lpType,      // address of buffer for value type
  LPBYTE lpData,       // address of data buffer
  LPDWORD lpcbData     // address of data buffer size
);
lpType
DWORD 型の変数へのポインタを指定します。
この変数に「値のデータ」の種類が格納されます。
次の値のいずれかが格納されます。
REG_DWORD 32 ビット値です。 
REG_SZ NULL で終わる文字列です。 
REG_BINARY 任意の形式のバイナリデータです。  
			
lpcbData
lpData パラメータで指定したバッファのサイズが入った DWORD 型の変数への
ポインタを指定します。関数が制御を返すと、この変数に、
lpData バッファにコピーされたデータのサイズが格納されます。
バッファが小さすぎるときは、必要なバイト数が格納され、関数は 
ERROR_MORE_DATA を返します。*/
			char str[80];
			wsprintf(str,"%d",value);
			MessageBox(hWnd,str,"",MB_OK);
		}	
		break;

 

 

BACK