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

オブジェクトの情報を取得する

ここではオブジェクトの情報を管理するHSPOBJINFO構造体の内容を取得してみようと思います。



  • スクリプトに
      1
      2
    
     
     
    
        objtext 1        ; (命令)プラグイン側でメッセージボックスを表示
        mes objtext(1)    ; (関数)テキストを返す
    
    と書くと指定したIDのオブジェクトのウィンドウテキストをメッセージボックスに表示したり、関数としてテキストを返したりする。
  • HSPOBJINFO構造体の取得方法を学ぶ。

ソースコード

+  step4DllMain2.cpp : 主要となるすべての関数本体が書かれたソースファイル

+  以前のソース

以前からの変更点

  • 以前まではオブジェクト情報の取得をcmdfunc()内に書いていたが関数としても使えるよう、オブジェクトタイトル取得用の関数CopyObjectTitle?()を用意した。

関数CopyObjectTitle?()と終了関数termfunc()

  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
 
 
 
-
|
|
|
|
-
|
-
|
!
|
|
!
 
 
-
-
|
|
!
|
!
static char *myref = NULL;
...
static char *CopyObjectTitle( int id, BMSCR *bm )
{
  ...
 
  /* 有効なオブジェクト */
  len = GetWindowTextLength( objinf.hCld );       // タイトルの長さを取得して...
  if ( myref ) {
    myref = (char *)hspexpand( myref, len + 1 );  // 領域の拡張(既存の領域より小さいサイズはそのまま)
  } else {
    myref = (char *)hspmalloc( len + 1 );         // 領域の確保
  }
 
  ...
}
 
static int termfunc( int option )
{
  if ( myref ) {
    hspfree( myref );   // 終了時に確保したバッファを開放する
    myref = NULL; 
  }
  return 0;
}

CopyObjectTitle?()は、引数に与えられた該当するHSPOBJINFO構造体からオブジェクトのハンドルを取得し、オブジェクトのテキストを保存しておくバッファを動的に確保してコピーします。
cmdfunc()、reffunc()はそれぞれがこのテキストを格納したバッファを参照して、メッセージボックスを表示したり、文字列を返す関数として振舞ったりします。

CopyObjectTitle?()は関数終了時にテキスト用に確保したバッファを解放しません。
このためスクリプトの実行が終了されたときにバッファを解放するためにプラグインが破棄される際に呼び出されるtermfunc()を定義し、そこでバッファを解放します。

参照関数reffunc()

reffunc()は登録したキーワードが関数として使われるときに呼び出され、呼び出し元に値を返します。
処理の仕方はhspsdk31b7\hspdll.txtの参照受け取りファンクションの手順に従えばいいでしょう。

ここで一番重要なのは、reffunc()の戻り値は返したい値を格納した領域へのポインタという点です。

  1
  2
  3
  4
  5
  6
 
-
|
|
|
!
static void *reffunc( int *type_res, int cmd )
{
  ...
  *type_res = HSPVAR_FLAG_STR;  // 返値のタイプを文字列に指定する
  return (void *)text;          // コピーしたテキストへのポインタを返す
}

返したい値はint型だったり、double型、str型だったりとさまざまなのでvoidポインタを返します。
voidポインタを受け取った側(HSP)はそれがどの型のポインタなのか知ることができないため、戻り値のタイプを*type_resに設定しておきます。

今回つかった型タイプフラグHSPVAR_FLAG_STRはhspvar_core.hで定義されています。

また、次のようにポインタを返す際、自動変数のポインタを返してはいけません。

  1
  2
  3
  4
  5
  6
  7
  8
  9
 
-
|
|
|
|
|
|
!
static void *reffunc( int *type_res, int cmd )
{
  double d;
  ...
  d = 3.14;
  ...
  *type_res = HSPVAR_FLAG_DOUBLE;
  return (void *)&d;        // 関数を抜けると変数dは使い物にならない
}

オブジェクト情報の取得

基本的にはHSPシステムが用意している関数を使えばいいのですが間違えると大変なことになる可能性があるので書いておきます。

オブジェクトのHSPOBJINFO構造体を取得するにはEXINFO構造体から提供されるgetobj()関数を使います。
ヘッダファイルやドキュメントから関数の戻り値と引数を調べましょう。以下はドキュメントからの引用です。

int getobj( int wid, int id, void *inf );

widで指定したウインドゥIDに配置されている、idで指定された番号のオブジェクト情報を取得します。
取得されたデータは、infで指定されたポインタにコピーされます。
HSP3の標準GUIを使用している場合は、infにはHSPOBJINFO構造体の内容がコピーされることになります。

つまりウィンドウ毎(BMSCR構造体)で管理されたHSPOBJINFOテーブルから該当するデータをコピーするわけですが、これをポインタのコピーと間違えないことです。
ポインタのコピーとは引数に指定したポインタ変数に、該当するHSPOBJINFO構造体のアドレスを渡すということです。

ただ渡すだけなら戻り値で渡せばいいので使用例がなくても「お?引数経由ということは書き込み用(指定したポインタの指す領域に書き込む)のかな?」と判断できます。

以下に簡単な(そのままでは使えない)使用例を間違い例と共に示します。

間違い例1

  1
  2
  3
 
 
 
HSPOBJINFO *pobjinf;
 
getobj( wid, id, pobjinf );  // どこを指しているのか分からないポインタを渡してしまう×

間違い例2

  1
  2
  3
 
 
 
HSPOBJINFO *pobjinf;
 
getobj( wid, id, &pobjinf ); // ポインタ変数のアドレスを渡してしまう×

正しい例

  1
  2
  3
 
 
 
HSPOBJINFO objinf;
 
getobj( wid, id, &objinf );  // HSPOBJINFO型変数のアドレスを渡す○

コメント

  • 4回目でプラグイン製作の流れも分かってきた頃かなということで今回は主要なコードだけを載せることにしました。 -- kz3 2006-01-23 (月) 13:16:56
  • 変数値じゃなくてオブジェタイトルですね。 試してみたら勘違いに気づきました。(-_-;) -- hiroki? 2006-01-23 (月) 15:07:31
  • ん、いつのまにhirokiさんコメントを・・・^^;プラグインの方を考えていてチェック忘れてたかな・・・。
    それから現状添付のファイルで間違いありました。
    範囲外チェックのところで正しくは「 id<0 | bm->objmax<=id 」です。直しておこう^^; -- kz3 2006-01-25 (水) 13:31:10
  • 論理和とORを間違えていましたorz -- kz3 2006-03-19 (日) 09:13:23
  • LongInt?が命令形式で変数を初期化したり、関数形式で型変換を行ったりできるのでどういう作りかなと思いましたが、キーワードを命令にも関数にも登録できるみたいなので記事を書き直します。 -- kz3 2007-03-21 (水) 12:16:47
  • とても参考になりました。ありがとうございましたm(__)m もしよろしければ、code_getvaとcode_setvaのサンプルも載せて頂けませんでしょうか?変数を取得して、それに1足すだけのものでも充分ですのでm(__)mよろしくお願いします。 -- tnr? 2007-03-23 (金) 11:27:38
  • もしよろしければtnrさんがページを作ってみてはいかがでしょうか [syobon] 関数形式の命令のつくり方も、とってつけたようにこのページにあるよりはテーマを絞ったページにあったほうがいいと思ってるところです。 -- kz3 2007-03-23 (金) 21:17:53
  • 分かりました!サンプル作れるところまでですが、作ってみます。でも期待はしないで下さいf^_^; -- tnr? 2007-03-24 (土) 09:03:58

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

添付ファイル:
filestep4DllMain2.cpp
205件 [詳細]
filestep4DllMain.cpp
225件 [詳細]
トップ    編集凍結 差分バックアップ添付複製名前変更リロード   新規一覧単語検索最終更新   最終更新のRSS
Last-modified: 2007-04-08 (日) 02:31:04 (2436d)