Written in Japanese.

おぼえがき

MFC / Win32API

動的DLLライブラリのロード

DLLファイルしかない場合、動的ロードするしかない
メインルーチンのはじめの方や好きなときに・・・

	
	// CPIZとの接続関数。関数ポインタ
	typedef BOOL (* BFunc)(LPCSTR , HWND);		// 接続関数
	typedef BOOL (* PFunc)(long, void*, long);	// ポート番号変数とのSetGet
	typedef BOOL (* EFunc)(LPCSTR ,LPCSTR);		// イベント発行関数
	typedef BOOL (* STFunc)(long, unsigned long, unsigned long);	// SETタイマ関数。
	typedef BOOL (* KTFunc)(long);	// KILLタイマ関数。
	
	// 関数ポインタの宣言
	BFunc ZIPCONNECT;
	BFunc ZIPCUT;
	PFunc ZIPsetPortV;
	PFunc ZIPgetPortV;
	EFunc ZIPsendEvent;
	STFunc ZIPsetTimer;
	KTFunc ZIPKillTimer;

	//・・・・・・
	//略
	//・・・・・・

	// DLLのロード関連。
    HINSTANCE hDLL = NULL;

    hDLL = LoadLibrary("PIVZPnl.dll"); // 動的ライブラリをロード
    if(hDLL == NULL) {
        MessageBox(NULL, "PIVZPnl.DLL が取得できません",
                   "ERROR", MB_OK | MB_ICONINFORMATION);
	    return 0;
    }
	
	// DLL内の関数と前に宣言した関数ポインタを関連付ける。
	ZIPCONNECT = (BFunc)GetProcAddress(hDLL, "PIVZ_LinkConnection");
	ZIPCUT = (BFunc)GetProcAddress(hDLL, "PIVZ_LinkCut");
	ZIPsetPortV = (PFunc)GetProcAddress(hDLL, "PIVZ_SetPortIDData");
	ZIPgetPortV = (PFunc)GetProcAddress(hDLL, "PIVZ_GetPortIDData");
	ZIPsendEvent = (EFunc)GetProcAddress(hDLL, "PIVZ_SendNameEvent");
	ZIPsetTimer = (STFunc)GetProcAddress(hDLL, "PIVZ_SetTimer");
	ZIPKillTimer = (KTFunc)GetProcAddress(hDLL, "PIVZ_KillTimer");
	
	
	//・・・・・・
	//略
	//・・・・・・

	// アプリケーション終了時には、忘れずに!
	FreeLibrary(hDLL);

RegisterWindowMessage

WindowMessageを共有する。
一意の割り振られていない UINT が割り振られるらしい。

	// メッセージを識別する変数の宣言
	UINT CPIZMes;

	//・・・・・・
	//略
	//・・・・・・

	switch (message)
	{
	case WM_INITDIALOG:
		
		if (!ZIPCONNECT(szWindowClass, hDlg)) {
			MessageBox(NULL, "CPIZと接続失敗", "ERROR", MB_OK);
		}
		
		// 接続したら、CPIZとメッセージを共有する。
		CPIZMes = RegisterWindowMessage("CPIZ-PNL INTERFACE");
		return TRUE;

	case WM_DESTROY:
		
		if (!ZIPCUT(szWindowClass, hDlg)) {
			MessageBox(NULL, "CPIZと切断失敗", "ERROR", MB_OK);
		}
		return TRUE;
		
	//・・・・・・・・・・・・
	//以下略

RegisterWindowMessageで登録したメッセージはCASE文で使えない。

	// Registerで登録したメッセージは定数でないので、CASE文で使えないようだ。
	if (message == CPIZMes) {
		switch(wParam)
		{
		case 1:		// 終了通知
			MessageBox(hDlg, "CPIZから終了通知されました。", "E70HUD", MB_OK);
			if (!ZIPCUT(szWindowClass, hDlg)) {
				MessageBox(NULL, "CPIZと切断失敗", "ずら", MB_OK);
			}
			return TRUE;
		case 2:		// リセット通知。CPIZのシミュレーションリセットボタンが押されると通知される。
			//MessageBox(hDlg, "CPIZからのリセットが通知されました", "E70HUD", MB_OK);
			
			// CPIZリセットによる外観アプリの初期化処理を行う場合はここで行います。
			
			return TRUE;
		case 11:		// 値更新

標準 C/C++

配列をnew したときのデストラクタなどで delete[] a の[]
本当に忘れやすい・・・気をつけよう!
const への参照のメンバ関数(定数メンバ関数、constメンバ関数)
Vector(const Vector& ivec) {
  int size = ivec.length();
  ・・・・・
}
のlength()は、「int length() const;」 と、constで宣言されなければならない。
非const関数は、非constオブジェクト以外に呼び出すことはできない(C++3rdP279)
Vector(const Vector& ivec) const引数
Vector(Vector& ivec) {・・・}
const無しの場合、定数、リテラル、型変換を必要とする引数、一時オブジェクトを渡せない。(C++3rdP135、P189)
memcpyを使わずに、いつでもmemmoveを使うようにすること。(「プログラミング作法」 P71より引用)
「memcpyは高速だが、コピー元とコピー先が重なっているとメモリが上書きされてしまう。
 memmoveは遅いが、どんな場合でも正しく動く。
 最初から1種類しかないと思って、いつでもmemmoveを使うようにすること。
 われわれがmemmoveを使うほうがいいと思う理由は、要素を間違った順序でコピーしてしまうというありがちなミスを防止できるからだ。」
sizeof(buf)--bufはポインタか、配列か
ポインタならば、ポインタ型のサイズが入る。32ビットなら4バイト
配列ならば、配列のサイズが入る。buf[xxx]で確保したバイト数。
クラス メンバ関数の関数ポインタ
DDspace で使用。
参考URL
ロベールのC++教室 - 第57章 メンバ関数ポインタ天国 -
メンバポインタ
0除算では、WIN32構造化例外が投げられる。Bcc32では例外として捕捉はできない。VCは可らしい。(windows)
BCC32ではtry-catchできない
コンストラクタの記述方法(標準)
コンストラクタの呼び出し方に2つある。
(ユーザー定義のStack型のクラスで、引数付のコンストラクタを使用)
1 Stack stack = Stack(15);
2 Stack stack(15);
2の方法はよく見かける。これは1の省略記法であるらしい。(ストラップ本P275)
1の形式はほとんど使われず、技術的には小さな違いがあるらしい。(標準講座C++ P281 )
違いは、この本(標準講座C++)の中で後述すると書いてあるが、どこに書いてあるかわからない・・・とても気になります。
コンパイラの動作はどちらも引数付コンストラクタを呼び出していた。(WindowXP,BCC32)

1で書かれた方法はあまりみかけないので、一時オブジェクトを使用したコピーコンストラクタだと思っていた。知新
演算子のオーバーロード オペレータオーバーロード(標準)
アドレス単項演算子
X* operator&()となる。(C++3rd P316)
間接参照の X* operator->()も同じ意味になる。(C++3rd P343)
マニピュレーター(標準)
std::ios::hex, std::ios::decがおかしい。
using namespace std;をしての、ios::hexもおかしい。
std::hexはOK、using namespace std;をしての、hexだけもOK。
マニピュレーター include<iomanip>(標準)
引数をとるマニピュレータを使用するときは、#include<iomanip>を忘れてはならない。(C++3rd P725) X* operator&()となる。
X* operator->()も同じ。
このページの先頭に戻る

STL

以下の内容は、主に「effective STL」(メイヤーズ著、ピアソンエデュケーション)を参考にしています。

vector
要素の全削除:void clear();
全削除をすると、size()は0になるが,capacity()のサイズは変わらない。
capacity()を減らす関数は見当たらない。未確認:resizeは?
要素の除去:remove()
template For remove(For first, For last, const T& val);
remove(co.begin(), co.end(), 99); //「99」の要素を削除する。
しかし、size()は変わらない。要素を前に詰めているだけだから。
removeとeraseを組み合わせて使用することにより、要素の削除が出来る。
co.erase(remove(co.begin(), co.end(), 99), co.end());
「effective STL(第32項)」より
要素の確保:reserve(int)
要素を増やすたびにメモリ確保をするオーバーヘッドを防ぐために、あらかじめメモリを確保する。
確保しただけだと、size()は増えない。0のまま。
capacity()で、確保されたメモリスロットの数を返す。
co.capacity()-co.size() で残りの容量を知ることが出来る。
capacity()を減らす関数は見当たらない。resize?
要求量がすでに確保されている量より少ないときは無視される。
sstream
int を string に変換して代入したい。
char buf[bufsize]を用意して、itoaでもできるが・・・
#include<sstream>

int a;    		//ここにintが入っている
string str		//ここに代入したい
ostringstream oss;
oss << a;
str = oss.str();    //string型に変換!
oss.str().c_str();でchar*型に変換も可能。
引用元:cppll : http://www.tietew.jp/cppll/archive/9232
sstream 型の、文字列検索をしたい。
ostringstream を、str() で string 型にして、 find_if で単項叙述関数を strncmp で比較すれば出来そう。
できそうだけど、めんどうになったし眠いので、strstrにしておいた。
このページの先頭に戻る

HTML / CSS

このページの先頭に戻る

やりがち単純ミス

このページの先頭に戻る

使用許諾条件の書き方

使用許諾条件・・・他のソフトではよく目にするけれど、実際に自分が書こうとすると何を書いてよいかわからないですね。でも免責事項だけは書いておかないと・・・と思っていました。

フリーウェアでは、タイトルは「使用許諾条件」ではなく、「著作権、免責事項」などと書かれているようです。以下の事柄について書いておけばよさそうな感じです。

以上の事柄を考慮して、当サイトのフリーウェアに関しては、以下のような「著作権、免責事項」文を作ってみました。

著作権、免責事項 の例。

こんなかんじにしてみました。

上記の「著作権、免責事項」の文章についてお使いになりたい方は、ご自由にお使いください。その結果生じた、いかなる損害にも一切の責任を負いません。

Webサイトにも免責事項を書いた方が良いようです。大変です。

英語のサイトで10 Big Myths about copyright explainedを見つけました。これによると著作権表記は無くても、保護されるようであり(ベルヌ条約)、copyright または©を使えるが(c)だけでは効力がないなどと書いてあるようです。all rights reserved.もいくつかの国では効力はあるが・・・などとあるようで、いずれ詳しく読んでみたいのでリンク貼っておきます。

当ウェブサイトの免責事項


Copyright © 2004 すなやま All rights reserved.

このページの先頭に戻る