プラグインからWin32 API MessageBox?()を呼び出す †
プラグイン作成初心者さん(自分も含めて)はまずWindowsプログラミングの基礎中の基礎、MessageBox?()をプラグインから呼び出せるかどうか試してみよう。
- スクリプトに
と書けばプラグインで用意した(固定された)メッセージボックスを表示するhsmsgboxプラグインを作る。
使用コンパイラ : BCC 5.5.1
+
| | msgbox.hsp : 今回つくるmsgbox命令のサンプルスクリプト
|
1
2
3
4
5
6
|
| #include "hsmsgbox.as"
mes "Hello, world !"
msgbox
mes "Goodbye, world !"
a = msgbox
|
|
+
| | hsmsgbox.as : スクリプトでmsgbox命令を使用可能にするためのインクルードファイル
|
1
2
3
|
| #regcmd "hsmsgboxinit","hsmsgbox.hpi"
#cmd msgbox $000
|
|
+
| | hsmsgbox.h : プロトタイプ宣言の書かれたヘッダファイル
|
1
2
3
4
5
6
7
8
9
10
|
| #ifndef _HSMSGBOX_H_
#define _HSMSGBOX_H_
static void msgbox( void );
static int cmdfunc( int );
#endif
|
|
+
| | hsmsgbox.cpp : 関数本体の書かれたソースファイル
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
-
|
|
|
|
|
!
-
|
|
!
-
|
|
|
|
|
|
|
|
!
-
|
|
|
|
|
-
|
|
|
|
|
|
|
!
|
!
| #include <windows.h>
#include "hsp3plugin.h"
#include "hsmsgbox.h"
static void msgbox( void )
{
MessageBox( NULL,
"メッセージボックス",
"テスト",
MB_OK );
return;
}
BOOL WINAPI DllEntryPoint(HINSTANCE hInst, DWORD dwReason, LPVOID lpvReserved)
{
return TRUE;
}
EXPORT void WINAPI hsmsgboxinit( HSP3TYPEINFO *info )
{
hsp3sdk_init( info ); info->cmdfunc = cmdfunc;
}
static int cmdfunc( int cmd )
{
code_next();
switch( cmd ) {
case 0x00:
msgbox();
break;
default:
puterror( HSPERR_UNSUPPORTED_FUNCTION );
}
return RUNMODE_RUN;
}
|
|
ここではBorland C++ 5.5.1 for Win32 をつかってコマンドラインでコンパイルを行います。
Win32 DLLを作る場合は「 bcc32 -WD filename 」と打ち込みます。
ここではDllEntryPoint?()、cmdfunc()、hsp3sdk_init()、msgbox()の4つの関数を説明します。
省略。
1
2
3
4
5
6
|
-
|
|
|
!
| EXPORT void WINAPI hsmsgboxinit( HSP3TYPEINFO *info )
{
hsp3sdk_init( info ); info->cmdfunc = cmdfunc; }
|
#regcmdによってこのプラグインを初期化する関数を定義します。
hsp3sdk_init()はhsp3plugin.cpp内で次のように定義されています。
1
2
3
4
5
6
7
8
9
|
-
|
|
|
|
|
|
!
| void hsp3sdk_init( HSP3TYPEINFO *info )
{
ctx = info->hspctx;
exinfo = info->hspexinfo;
type = exinfo->nptype;
val = exinfo->npval;
}
|
ここで出てきた4つの変数はいずれもhsp3plugin.cpp内で定義されているグローバル変数で、ソースのどこからでも参照できます。
グローバル変数ctx、exinfoにHSPCTX構造体、HSPEXINFO構造体へのポインタを設定し、type、valにはパラメータに関する情報へのポインタを設定しています。
1
|
| info->cmdfunc = cmdfunc;
|
hspの命令として実行される関数を登録します。
HSP3TYPEINFO構造体はhsp3struct.h内で定義されています。ここで値を設定しているcmdfuncメンバは以下のように定義されています。
このメンバは関数ポインタであり、任意の関数を実行できるようになっています。(引数の一致に注意)
#cmdで定義する新規命令に与えられるサブIDごとの処理をコマンド受け取りファンクションに登録した関数に書いていきます。
- 何から書いていいのか分からないので、いきなりソースから。 -- kz3
- まぁSDK仕様ガイドのままですが・・・。一応私の方では無事DLLも作成でき、スクリプトからmsgbox()を呼び出せました。あ、dllも添付しておいたほうがいいか・・・。dllはHSPのものと分かるように拡張子をhpiにしています。 -- kz3
- 使われない関数(reffunc termfunc)は無理に登録しなくてもいいみたいです。あと、reffuncはNULLを変えすのではなくてサポート外エラーを発生させた方がいいと思いますが・・・。 -- QIG
- アホな質問しますが、hsp3plugin.hってどこにあるんですか。 HSP3フォルダ等を検索したんですけど。 -- hiroki?
- ダウンロードしたHSPSDKのsampleフォルダに入ってます。>hsp3plugin.h -- QIG
- そっか、参照ファンクションとか使わなければ無理に指定しなくてもいいんですね^^; -- kz3
- というわけでファイル差し替え。それとhpiファイルですが実行可能なファイルというのは何かと危険ですので省きました。C/C++コンパイラを持っていない方、テストが出来なくてごめんなさい。 -- kz3
- ありました。 こんな所に隠れていたのね。 でもコンパイルでエラーが...(^_^;) -- hiroki?
- makefileも要るかな^^; -- kz3
- 懐かしの言葉makefileかー。 でもhelow worldの表示だけのコンパイルは出来たんですけどね。試してみます。 -- hiroki?
- やっぱりこんなメッセージが出ます。 関係ない質問でページを汚してすいません。;
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
hsmsgbox.cpp:
警告 W8057 hsmsgbox.cpp 23: パラメータ 'hInst' は一度も使用されない(関数 __stdcall DllEntryPoint?(HINSTANCE__ *,unsigned long,void *) )
警告 W8057 hsmsgbox.cpp 23: パラメータ 'dwReason' は一度も使用されない(関数 __stdcall DllEntryPoint?(HINSTANCE__ *,unsigned long,void *) )
警告 W8057 hsmsgbox.cpp 23: パラメータ 'lpvReserved' は一度も使用されない(関数 __stdcall DllEntryPoint?(HINSTANCE__ *,unsigned long,void *) )
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
Error: 外部シンボル 'hsp3sdk_init(HSP3TYPEINFO *)' が未解決(L:\BCC\HSMSGBOX.OBJ が参照)
Error: 外部シンボル '_exinfo' が未解決(L:\BCC\HSMSGBOX.OBJ が参照)
- hsp3plugin.cppもコンパイルしてリンクしないとダメです・・・。 -- kz3
- 警告は出るけど、一応動作確認しました。 ありがとうございました。m(_ _)m -- hiroki?
- 昨日、Visual C++ 2005 Express Edition をダウンロードしましたーー;(長かった・・・) -- kz3
- あらら、Visual C++ 2005 Express Editionが無償になっている。むかーし、4.0を数万円もして買ったのに。 -- hiroki?
- SDK,Win DLLを使えるとは、知らなかった、Turbo C++使える? -- kohfow
- いつの間に「名前」が?、差し支え無いんでしょうか? -- kohfow
- Visual C++ 2010 Express EditionでC言語(C++ではなく)でコードを書いていたのですが、ソースコードの拡張子が.cだと
hspcksum.obj : error LNK2019: 未解決の外部シンボル _hsp3sdk_init が関数 _hsp3cmdinit@4 で参照されました。
1>hspcksum.obj : error LNK2001: 外部シンボル "_val" は未解決です。
1>hspcksum.obj : error LNK2001: 外部シンボル "_exinfo" は未解決です。
1>hspcksum.obj : error LNK2001: 外部シンボル "_type" は未解決です。
と怒られます。しかし、拡張子を.cppに変更すると正しくコンパイルできます。中身がC言語(C++ではなく)でも、拡張子には気を付けないといけないようです。 -- MihailJP?