はじめに

この文書は、当社で提供しているドライバの 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 は、ベースクラスの方で定義しており、これは派生クラスでも使用できますの
で、そのまま渡してください。

 

→開発環境(プログラミング)についてのQ&Aに戻る


テクニカルサポート
Home Page