hinekure.net が http://hspdev-wiki.net/ から自動クローリングした結果を表示しています。画像やリソースなどのリンクが切れています。予めご了承ください。
MakeHPI/cpp/chapter1 - HSP開発wiki
トップ    編集凍結 差分バックアップ添付複製名前変更リロード   新規一覧単語検索最終更新   最終更新のRSS

プラグインからWin32 API MessageBox?()を呼び出す

プラグイン作成初心者さん(自分も含めて)はまずWindowsプログラミングの基礎中の基礎、MessageBox?()をプラグインから呼び出せるかどうか試してみよう。



  • スクリプトに
      1
    
     
    
        msgbox
    と書けばプラグインで用意した(固定された)メッセージボックスを表示するhsmsgboxプラグインを作る。

ソースリスト

使用コンパイラ : BCC 5.5.1
+  msgbox.hsp : 今回つくるmsgbox命令のサンプルスクリプト
+  hsmsgbox.as : スクリプトでmsgbox命令を使用可能にするためのインクルードファイル
+  hsmsgbox.h : プロトタイプ宣言の書かれたヘッダファイル
+  hsmsgbox.cpp : 関数本体の書かれたソースファイル

コンパイル

ここではBorland C++ 5.5.1 for Win32 をつかってコマンドラインでコンパイルを行います。
Win32 DLLを作る場合は「 bcc32 -WD filename 」と打ち込みます。

ここではDllEntryPoint?()cmdfunc()hsp3sdk_init()msgbox()の4つの関数を説明します。

DLLエントリーポイント

省略。

プラグイン初期化・登録関数

  1
  2
  3
  4
  5
  6
 
-
|
|
|
!
EXPORT void WINAPI hsmsgboxinit( HSP3TYPEINFO *info )
{
    /* プラグイン初期化 (実行・終了処理を登録します) */
    hsp3sdk_init( info );      // SDKの初期化(最初に行なって下さい) 
    info->cmdfunc = cmdfunc;   // 実行関数(cmdfunc)の登録
}

#regcmdによってこのプラグインを初期化する関数を定義します。

SDKの初期化

hsp3sdk_init()はhsp3plugin.cpp内で次のように定義されています。

  1
  2
  3
  4
  5
  6
  7
  8
  9
 
-
|
|
|
|
|
|
!
void hsp3sdk_init( HSP3TYPEINFO *info )
{
    //		SDK初期化
    //
    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;   // 実行関数(cmdfunc)の登録

hspの命令として実行される関数を登録します。
HSP3TYPEINFO構造体はhsp3struct.h内で定義されています。ここで値を設定しているcmdfuncメンバは以下のように定義されています。

  1
 
    int (* cmdfunc) (int);         // コマンド受け取りファンクション

このメンバは関数ポインタであり、任意の関数を実行できるようになっています。(引数の一致に注意)

コマンド受け取りファンクション

#cmdで定義する新規命令に与えられるサブIDごとの処理をコマンド受け取りファンクションに登録した関数に書いていきます。

コメント

  • 何から書いていいのか分からないので、いきなりソースから。 -- kz3 2006-01-10 (火) 12:23:52
  • まぁSDK仕様ガイドのままですが・・・。一応私の方では無事DLLも作成でき、スクリプトからmsgbox()を呼び出せました。あ、dllも添付しておいたほうがいいか・・・。dllはHSPのものと分かるように拡張子をhpiにしています。 -- kz3 2006-01-10 (火) 13:26:16
  • 使われない関数(reffunc termfunc)は無理に登録しなくてもいいみたいです。あと、reffuncはNULLを変えすのではなくてサポート外エラーを発生させた方がいいと思いますが・・・。 -- QIG 2006-01-10 (火) 18:24:40
  • アホな質問しますが、hsp3plugin.hってどこにあるんですか。 HSP3フォルダ等を検索したんですけど。 -- hiroki? 2006-01-10 (火) 19:01:14
  • ダウンロードしたHSPSDKのsampleフォルダに入ってます。>hsp3plugin.h -- QIG 2006-01-11 (水) 00:29:24
  • そっか、参照ファンクションとか使わなければ無理に指定しなくてもいいんですね^^; -- kz3 2006-01-11 (水) 09:06:34
  • というわけでファイル差し替え。それとhpiファイルですが実行可能なファイルというのは何かと危険ですので省きました。C/C++コンパイラを持っていない方、テストが出来なくてごめんなさい。 -- kz3 2006-01-11 (水) 09:22:27
  • ありました。 こんな所に隠れていたのね。 でもコンパイルでエラーが...(^_^;) -- hiroki? 2006-01-11 (水) 09:37:28
  • makefileも要るかな^^; -- kz3 2006-01-11 (水) 10:09:07
  • 懐かしの言葉makefileかー。 でもhelow worldの表示だけのコンパイルは出来たんですけどね。試してみます。 -- hiroki? 2006-01-11 (水) 10:13:31
  • やっぱりこんなメッセージが出ます。 関係ない質問でページを汚してすいません。;
    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 2006-01-11 (水) 11:04:55
  • 警告は出るけど、一応動作確認しました。 ありがとうございました。m(_ _)m -- hiroki? 2006-01-11 (水) 11:17:57
  • 昨日、Visual C++ 2005 Express Edition をダウンロードしましたーー;(長かった・・・) -- kz3 2006-01-12 (木) 08:35:26
  • あらら、Visual C++ 2005 Express Editionが無償になっている。むかーし、4.0を数万円もして買ったのに。 -- hiroki? 2006-01-12 (木) 10:36:22
  • SDK,Win DLLを使えるとは、知らなかった、Turbo C++使える? -- kohfow 2008-05-31 (土) 10:26:27
  • いつの間に「名前」が?、差し支え無いんでしょうか? -- kohfow 2008-07-13 (日) 23:36:39
  • 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? 2012-01-20 (金) 22:22:01

URL B I U SIZE Black Maroon Green Olive Navy Purple Teal Gray Silver Red Lime Yellow Blue Fuchsia Aqua White

添付ファイル:
filemsgbox.hsp
437件 [詳細]
filemakefile
201件 [詳細]
filehsmsgbox.h
450件 [詳細]
filehsmsgbox.cpp
441件 [詳細]
filehsmsgbox.as
416件 [詳細]
トップ    編集凍結 差分バックアップ添付複製名前変更リロード   新規一覧単語検索最終更新   最終更新のRSS
Last-modified: 2012-01-20 (金) 22:22:18 (687d)