VisualBasic 2008Expressではすでにハムログへのデータ送出関連はすべてできているから変数値の確認はVBを利用できるので安心だ。とにかくWindowsAPIなるものを使用して行うわけだが、やはりVisualC++2010ExpressのC++/CLIでの実際の利用例がないに等しい。もちろんマイクロソフトのホームページにはMSDNライブラリがある。これはやはりサンプルコードがあるが実際の例として使うには少しわかりずらい。何度本屋へ行って専門書を調べようかと思ったことか。今回悩んだのは対象Windowsフォームからハンドル取得のUser32ライブラリのFindWindows関数の引数の設定である。インターネットで調べたVC++2010での関数引数例をそのまま利用すると見事にすべてエラーが発生する。まず第一に宣言している内容がMSDNライブラリでは以下のようにかかれている.MFCの例だがAPIも踏襲されているので仕様はほぼ同じだ(似ている。?)
--------------------------------------------------------------------------------
static CWnd* PASCAL FindWindow(
LPCTSTR lpszClassName,
LPCTSTR lpszWindowName
);
パラメーター
lpszClassName
ウィンドウのクラス名 (WNDCLASS 構造体) を示す NULL で終わる文字列へのポインター。 lpClassName が NULL のときは、すべてのクラス名が一致します。
lpszWindowName
ウィンドウ名 (ウィンドウのタイトル) を示す NULL で終わる文字列へのポインター。 lpWindowName が NULL のときは、すべてのウィンドウ名が一致します。
---------------------------------------------------------------------------------
このパラメータがインターネットの大概のサンプルでは第1パラメータと第2パラメータが逆になっているのだ。これは本当に困る。そのまま信じてコーディングするとエラーから抜け出せなくなる可能性が大である。MSDNライブラリできちんと第1パラメータはウィンドウのクラス名、第2パラメータはウィンドウ名(ウィンドウのタイトル)と記載されてる。今回はこのクラス名を調べるプログラムを利用してハムログのクラス名を確認して行った。VB2008Expressではハムログのクラス名は’TThwin'とJG1MOU浜田OMの資料HamlogMs.txt上に記載されているので、そのまま使用できる。これは作者でないとわからないわけだが、さきのクラス名を調べるプログラムは大変ありがたい。いろいろとあるようだが、私が使ったのはwinmap.exeというエクスプローラ風のアプリケーションです。これでハムログのクラスが間違いなく’TThwin'であることが確認できました。またパラメータの記載の方法もインターネット上の資料には正確に記載しているものが、ごくわずかでした。クラス名の第1パラメータへの記載の実際は
VC++2010Expressの例としてのNG例とOK例を以下に記します。実際にOK例はすべて確認済みです。
-------------------------------------------------------------------
[NG例]
Hwnd1=FindWindow(("TThwin"),NULL);
[OK例]
Hwnd1=::FindWindow((LPCTSTR)_T("TThwin"),NULL);
Hwnd1=FindWindow((LPCTSTR)_T("TThwin"),NULL);
Hwnd1=::FindWindow(_T("TThwin"),NULL);
-------------------------------------------------------------------
以上のとおりまず関数前の”::”がVisualC++2010Expressでは要るらしいが、なくてもコンパイルは通るようです。
またクラス名のパラメータ指定をマクロの"_T"で指定することである。(LPCTSTR)はあってもなくてもよいようです。ハムログのデータ送出で使う他関数についてはサンプルを(詳細は省略)以下に記します。また実際コードは画像を参考にしてください。
-------------------------------------------------------------------
『SendMessage関数』
::SendMessage(Hwnd2,WM_COPYDATA,wParam, lParam);
『SendMessage関数』
bool kite=0;
kite=::SetForegroundWindow(Hwnd2);
-------------------------------------------------------------------
ボタンをひとつ用意してボタンを押すとハムログのCALLのテキストにあらかじめ用意したデータのコールサインが送られるサンプルです。CALLを指定するデータはSendMessage関数のパラメータにlParamとして送られます。送出されると次の日付にフォーカスが移り終了します。これもSendMessage関数で任意の位置へカーソルを動かす指定をしてリターンコードを送るようにすれば自在にカーソルフォーカス位置の制御が可能です。VBでは自動でPCの日付を入れてコールサインへフォーカス指定の制御をしていました。
コマンドボタンでのハムログ入力ダイアログへのデータ送出がVC++/CLIで可能となりました。ついでにこの送出部を汎用性を持たせるべく関数化(戻り値なし)しました。
--------------------------------------------------------------------
『ヘッダー部での宣言』
void hamlogTX_datvc2010(int dcode,char hamdat[256]);
『プログラム上での関数の使用(ボタン内のコード)』
int dcode=1;
char hamdat[]="HAMLOG ";
hamlogTX_datvc2010(dcode,hamdat);
dcode=2;
char hamdat1[]="11/11/11";
strcpy_s(hamdat,hamdat1);
hamlogTX_datvc2010(dcode,hamdat);
--------------------------------------------------------------------
上はコールサインの場所にコマンド1を指定して"HAMLOG"データをセットしhamlogTX_datvc2010関数を指定します。同じルーチンで複数個所のデータを送る場合はデータはConstですので、別配列をそれぞれつくってそれにデータを入れそれを規定の配列にstrcpy_sでコピーしてhamlogTX_datvc2010関数を指定します。上はコールサインと日付が関数を利用してデータ送付される例です。
関数化すると本当に楽になります。関数の利用はdcodeにはハムログ入力ダイアログの送出場所指定番号、hamdatには送出文字データをセットして関数を指定します。
ここで注意することは、charの指定です。配列は[256]を予約していますが、最初のデータが入ったときにhamdatが自動にて入れたデータ文字数が予約されてしまいます。ですので、最初のデーターは文字データ数の最大を予想してスペースをデータとして入れてあります。そうしないと最初の文字データ+内部コード(改行等)の文字数よりデータ数が多いものを送るとエラーとなります。このブログ上では空白部が削除されてしまっています。"HAMLOG**************************************************";*はわかるように空白がわりに書き換えしました。実際は空白です。
またVISUALC++2008ExpressではUSER32.DLLの関数の宣言が異なりました。FindWindowの例を下記します。
---------------------------------------------------------------------
『VC++Express2010宣言』
[DllImport("user32.dll")]
extern System::IntPtr FindWindow(String^ className, String^ wndName);
『VC++Express2008宣言』
extern System::IntPtr __declspec(dllimport) __cdecl FindWindow(unsigned char className,unsigned char wndName);
---------------------------------------------------------------------
他インクルードヘッダーとして以下を使いましたので追加してます。
#include <tchar.h> // '_T'識別子用
#include <windows.h> // strcpy_s,strlen,他各定義用(HWND,LPARAM,........)
いつも思うのだが、このVisualC++2010Expressもそうだが、資料の公開があまりにもされていないので普及していないのだと思う、動くサンプルがユーザーを増やすのだがこれが少ないためユーザーが少ない。とにかく簡単なサンプルからはじめるのが一番良いと思っています。
以上今回の作業は終了!。次はハムログからのデータ読み取りを行いたいですが、これまた大変そうであるので、まずは、UUSBIOのLEDの点滅の制御とか、現在のハムログの2重起動防止などの細かいところをやって見ようかしらん!?ステップバイステップ!! つづく