この文書は、当社で提供しているドライバの C (Visual C++)用 のソースを MFC へ実装する
ための FAQ が記述されております。
尚、この実装 FAQ は MS-Visual C++ 6.0(以下 VC) を元に記述しておりますが、基本
的なやり方は旧バージョンの VC と同じです。
1)当社で提供している VC のヘッダーなどのソースファイルを、現在開発している
プロジェクトに追加してください。
2) 1)より、このときラッパーソースファイルも追加する場合、コンパイル時にエラー
が発生するはずですので、VC のメニューの [プロジェクト(P)]-[設定(S)] を選択し
て、[プロジェクトの設定]ダイアログボックスを表示してください。
[設定の対象]で[すべての構成]を選択してください。
リストボックス内に、追加したラッパーソースファイルがありますがこれを選択し、
右側にある[C/C++]を選択表示させてください。
[カテゴリ]で[プリコンパイル済みヘッダー]を選択してください。プリコンパイル処
理に関する設定が表示されます。
ここで、[プリコンパイル済みヘッダーを使用しない]を選択して、[OK]ボタンを
押してください。
ラッパーソースファイル以外の、ソースファイルの設定は上記の設定をしないように
してください。
ラッパーソースファイルとは、例えばドライバファイル名が、apci8815.sys(vxd)で
あるならば、そのファイル名は、apci8815w.c を指します。
また、同時に配布しております、VC 用の LIB ファイルはプロジェクトに追加しない
でください。
3) 1)より、このときラッパーソースファイルを追加しないのであれば、VC 用の LIB
ファイルもプロジェクトに追加してください。
4)ドライバにアクセスする各 API は、サンプルソースを参考に実装してください。
5)送出するユーザー定義メッセージを、処理を行うクラスのヘッダーファイルに
記述してください。(注:クラスの中に記述しないでください。)
例)
#define WM_8815_EOC (WM_USER + 300 + WM_EOC)
#define WM_8815_BUFF_HALF_FULL (WM_USER + 300 + WM_BUFF_HALF_FULL)
#define WM_8815_BUFF_FULL (WM_USER + 300 + WM_BUFF_FULL)
#define WM_8815_BUFF_OVERFLOW (WM_USER + 300 + WM_BUFF_OVERFLOW)
#define WM_8815_SAMPLING_OVERRUN (WM_USER + 300 + WM_SAMPLING_OVERRUN)
ユーザー定義のメッセージは、WM_USER 以上 WM_APP 未満の範囲内に収まるように
してください。
6) 5)より、処理を行うクラスのヘッダーファイルに、送出されたユーザ定義メッセージ
を処理するメンバ関数の定義を行います。
記述する位置は必ず、
//{{AFX_MSG(処理クラス名)
の直前か
//}}AFX_MSG
の直後に記述してください。
//{{AFX_MSG(処理クラス名)
と
//}}AFX_MSG
の中に、メンバ関数を定義しますと、VC の ClassWizard が見失う場合があります
ので、注意してください。
また、
DECLARE_MESSAGE_MAP()
の下に、メンバ関数を定義してもコンパイルがうまくいきませんので、注意してください。
ユーザー定義メッセージを処理するメンバ関数の定義は、定義したメッセージ名称が、
WM_8815_EOC
でしたら
afx_msg LRESULT On8815Eoc(WPARAM wParam, LPARAM lParam);
というように、記述してください。(引数と戻り値の型は固定です。)
例)
// 生成されたメッセージ マップ関数
afx_msg LRESULT On8815Eoc(WPARAM wParam, LPARAM lParam); // <-- これです。
//{{AFX_MSG(CApci8815Dlg)
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
afx_msg void OnDestroy();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
7) 6)より、ヘッダーファイルにユーザー定義メッセージと、処理するクラスにメンバ
関数の定義を実装しましたら、それに対応するソースファイル(拡張子.cpp)に、メッ
セージを振り分ける箇所へ、以下の記述をします。
BEGIN_MESSAGE_MAP(処理クラス名, ベースクラス名)
END_MESSAGE_MAP()
が記述されている箇所がありますので、必ずこの中に
ON_MESSAGE(ユーザ定義メッセージ, 処理するメンバ関数名)
を実装してください。
ただし、これも以下の中に、記述しないようにしてください。VC の ClassWizard が
見失う場合があります。
//{{AFX_MSG_MAP(処理クラス名)
//}}AFX_MSG_MAP
例)
BEGIN_MESSAGE_MAP(CApci8815Dlg, CDialog)
ON_MESSAGE(WM_8815_EOC, On8815Eoc) // <-- これです。
//{{AFX_MSG_MAP(CApci8815Dlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_WM_DESTROY()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
8) 次に実際に処理を行う、メンバ関数を記述します。
例)
LRESULT CApci8815Dlg::On8815Eoc(WPARAM wParam, LPARAM lParam)
{
// メッセージ固有の処理を行う。
return 0; // メッセージ固有の戻り値を返す。ここでは 0 を返しています。
}
9) 最後に、当社で提供しているドライバで、ウィンドウハンドルを引数として、要求し
ている API には、
Apci8815Create(&wLogSlot, m_hWnd, WM_8815_EOC, NULL);
======
というように、処理したいクラスの m_hWnd を引数に渡してください。m_hWnd は、ベースクラスの方で定義しており、これは派生クラスでも使用できますの
で、そのまま渡してください。