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

スクリプトからMessageBox?()に引数を渡す

step1でMessageBox?()を呼び出すことが出来たので、今度は文字列パラメータを受け取って指定した文字列を表示するメッセージボックスを作ってみる。



使用コンパイラ

BCC 5.5.1

  • スクリプトに
      1
    
     
    
        msgbox2 "Hello, world !", "msgbox2 test"
    と書けばメッセージボックスのテキストに「Hello, world !」を表示し、タイトルに「msgbox2 test」と表示するhsmsgbox2プラグインを作る。
  • スクリプトで記述した文字列引数をプラグイン側で取得する方法を学ぶ。

ソースコード

+  dllmain.cpp
+  msgbox2.h
+  msgbox2.cpp
+  プラグイン定義ファイル
+  サンプルスクリプト

まずはじめに微妙な変更点があります。

  • プラグイン登録関数を○○initからregister_hsmsgbox2()にしました。(好みです。)
  • ファイルを分割。
文字列型のパラメータを取得する

文字列型のパラメータを取得するにはcode_getds()、code_gets()を使って文字列へのポインタを取得します。
この二つの関数の違いですが、省略可能なパラメータにはcode_getds()を使い、必須パラメータにはcode_gets()を使います。

文字列を取得するに当たって注意する点が1つあります。
得られたポインタは次のパラメータ(型は問わない)を取得するまでの間に限って有効であるということです。
よって複数のパラメータを扱う場合はデータのコピーが必要になります。

メモリ管理

データを保持するための領域に静的変数を使うか、動的確保にするかの制限はありません。
C/C++ならmalloc()で動的割り当ても可能です。

ただしこの場合メモリ管理はプログラマが全責任を負って行う必要があります。
動的に割り当てたメモリのルートなどを管理しておいてコールファンクションの終了処理で一括解放というのもいいと思います。

その他にはHSPのバッファマネージャを利用して動的に確保するという手段があります。
バッファマネージャを利用したメモリの動的確保はバッファマネージャが管理するメモリブロックにエントリーされ、HSPの終了時に自動的に解放されます。

バッファマネージャによるメモリ管理の仕組みはstrbuf.cppで定義されています。

バッファマネージャ

バッファマネージャを利用した動的確保はhspmalloc()によって行います。サンプルでは、

  1
  2
  3
  4
 
 
 
 
    /* 第一パラメータ取得 */
    sprm = code_gets();
    text = hspmalloc( lstrlen( sprm ) + 1 ); // バッファを確保
    lstrcpy( text, sprm );                   // バッファにコピー

のように文字列長+ヌル文字分の領域を確保してコピーしています。
ただしこの方法、あまりいいとは思えません。^^;

この関数(msgbox2)は実行されるたびに新しい領域を割り当て、以前割り当てた領域はそのままバッファマネージャにエントリーされたままです
関数を抜ける前に解放するか、既存の領域を使いまわして領域オーバーしそうだったら拡張させるとかが一般的だと思います。
バッファマネージャは領域の解放にhspfree()、内容を保持したままの拡張にhspexpand()を提供しています。

特に文字列の長さにあわせるのではなく「○○長以上の文字列は○○以降は切り捨てられます。」といった仕様なら静的変数を使ってもいいと思います。

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 
 
 
 
 
-
|
|
|
|
|
|
|
|
|
|
|
|
!
// 静的変数で領域を使いまわす例
static char text[ HSMSGBOX_MAXCHAR + 1 ];
static char title[ HSMSGBOX_MAXCHAR + 1 ];
 
void msgbox2( void )
{
    char *sprm;
    int len;
    
    sprm = code_gets();
    len = lstrlen( sprm ) + 1;
    lstrcpyn( text, sprm, len < HSMSGBOX_MAXCHAR ? len : HSMSGBOX_MAXCHAR );
    
    sprm = code_gets();
    len = lstrlen( sprm ) + 1;
    lstrcpyn( title, sprm , len < HSMSGBOX_MAXCHAR ? len : HSMSGBOX_MAXCHAR );
    
    MessageBox( NULL, text, title, MB_OK );
}

コメント

  • 本人以外がソースの解説するのもアリですよ。(ぁ
    あといきなりメモリの動的割り当てやってます。諸プログラミング本の流れでは静的変数->動的割り当て・・・と思って「解説」のところに静的変数を用いた例をコメントアウトしています。 -- kz3 2006-01-12 (木) 10:45:50
  • 僕もstep1のソースに、beep 16としたら音が出るようにMessageBeep?を追加したらうまくいってくれました。まだ戻り値の取得方法ががいまいち?です。 -- hiroki? 2006-01-12 (木) 11:00:19
  • HSPCTX構造体にhspのシステム変数statを表すstatメンバがありますよ。プラグイン側でctx->stat=MessageBeep?();みたいなこと(笑)をやればスクリ側のstatで戻り値を得られるかも知れません。(思いつきで言ってます。) -- kz3 2006-01-12 (木) 11:13:19
  • 下記の方法で試してみたら返りました。(-_-;)
 static void beep( int mbn )
 {
     stat=MessageBeep(
	       mbn   // サウンドの形式
          );
     return;
 }
  • あ、hsp3plugin.hで#define stat ctx->statってマクロで定義されていましたね〜^^思いつきは合っていたので良かったです。 -- kz3 2006-01-12 (木) 12:11:37
  • int mbn って書いたけど、UINT mbn なのかな。 -- hiroki? 2006-01-12 (木) 13:08:25
  • やっばりint mbn でした。 UNITではエラーが出ます。 -- hiroki? 2006-01-12 (木) 13:27:56

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

添付ファイル:
filemsgbox2.hsp
251件 [詳細]
filemsgbox2.h
275件 [詳細]
filemsgbox2.cpp
279件 [詳細]
filemakefile
141件 [詳細]
filehsmsgbox2.as
266件 [詳細]
filedllmain.cpp
304件 [詳細]
トップ    編集凍結 差分バックアップ添付複製名前変更リロード   新規一覧単語検索最終更新   最終更新のRSS
Last-modified: 2007-04-08 (日) 02:31:00 (2436d)