HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2009
0825
p、USAGIHSPEXINFO構造体へのポインタ12解決


p、USAGI

リンク

2009/8/25(Tue) 23:08:34|NO.27304

HSPEXINFO構造体(へのポインタ)を取得したいのですが、どうすれば良いのでしょうか?

HSPEXINFO = HSPEXINFO構造体? prm = varptr(HSPEXINFO) res = callfunc(prm, xxx, 1)
この様にしてDLLに渡したいです。



この記事に返信する


ANTARES

リンク

2009/8/26(Wed) 00:19:06|NO.27309

 mref命令のHSPCTX構造体経由で取得できます。



ANTARES

リンク

2009/8/26(Wed) 02:03:05|NO.27320

あるいは

#uselib "DLL名" #func 好きな名前 xxx $202 好きな名前 p1,p2,p3,……: rt=stat rs=refstr



p、USAGI

リンク

2009/8/26(Wed) 07:13:08|NO.27322

>mref命令のHSPCTX構造体経由で取得できます。
具体的にどの様にすればいいのでしょう?

例えばPVALの場合、以下の様にすればポインタを取得できます。

#defcfunc pvalptr var p1 //指定した変数のPVALポインタ値を取得 mref HSPCTX, 68 dupptr vptr, HSPCTX.207, 8, 4 return vptr


>#func 好きな名前 xxx $202
この方法は、なしの方向で・・・



レノス

リンク

2009/8/26(Wed) 17:54:08|NO.27332

Dll に渡したいだけなら、引数タイプ pexinfo を使ったほうが早いです。
また、これを使って、pexinfo 引数の値を返すだけの関数を作る、という手が安全で確実です。

どうしても取得部分をHSPでやりたい場合は以下。
exinfo は ctx の内部にいます。どこにいるかは hspsdk/hsp3struct.h を参照。
あまり安全ではないです。

mref ctx, 68 dupptr exinfo, varptr(ctx(12)), 49 * 4 // ちゃんと exinfo になっているかどうか確かめる dupptr ref_strsize, exinfo(8), 4 ref_strsize = 320 mes strsize stop



p、USAGI

リンク

2009/8/27(Thu) 06:53:55|NO.27346

>ANTARESさん
>レノスさん
ありがとうございます。
しかし、もう少し情報を下さい、、、と言うか正直ギブアップな感じです。(自分にガッカリ)
ここhttp://www.onionsoft.net/hsp/hspdll.html
や、このファイル(hsp32/hspsdk/hpi3sample/hsp3struct.h)
を見たりしていろいろ試しましたが、
callfuncでDLLに渡した瞬間にエラーが発生します。


大変恐縮なのですが、最低限必要なプログラムを書くので
成功するようにして頂けないでしょうか?



レノス

リンク

2009/8/27(Thu) 20:08:24|NO.27359

そのページ(上の方)は hsp2 時代のものなので、参考にならないと思います。
…… プラグインを作ろうとしているんですか? → そうなら HSP開発wiki の MakeHPI を参照。

試したスクリプトと、呼び出そうとしているものが何かを提示していただけると、
こちらとしては回答しやすいです。

後、「callfunc で Dll に渡す」は Dll → 関数 と読み替えていいのでしょうか。



p、USAGI

リンク

2009/8/28(Fri) 05:01:46|NO.27366

以下のスクリプト(モジュール)が成功すれば、
DLLをEXEにパックして配布出来ます。
これはobaq版ですがすでに、hspext版は完成しております。

>#func qreset qreset $202 (obaq.as)
この$202でつまずいています。


#include "kernel32.as" obaq_path = dir_exe+"\\obaq.dll" LoadLibrary obaq_path : hobaq = stat if hobaq=0 : stop ; 初期化失敗 GetProcAddress hobaq,"_qreset@16" : _qreset = stat GetProcAddress hobaq,"_qdraw@16" : _qdraw = stat #module #deffunc qreset ; mref ctx, 68 ; dupptr exinfo, varptr(ctx(12)), 49 * 4 prm = varptr(exinfo) res = callfunc(prm, _qreset, 1) return res #deffunc qdraw int p2 ; mref ctx, 68 ; dupptr exinfo, varptr(ctx(12)), 49 * 4 prm = varptr(exinfo),p2 res = callfunc(prm, _qdraw, 2) return res #global boxf qreset ; 初期化 qdraw 0 ; オブジェクトの描画 redraw 1 ; 壁が表示されたら成功です



ANTARES

リンク

2009/8/28(Fri) 09:03:04|NO.27368

 HSP3.0のSDKをダウンロードして数えてみたけど、どうしても1要素あいません。
206がstmpで216がrefdvalなのはほぼ間違いないと思います。211,212,214,215が
0なのですが、関数ポインタが0ってことはないでしょうから、213がmsgfuncかと
思いますが、そうすると、「void *wnd_parent」が8バイト? んなバカな。

#deffunc qreset mref ctx, 68 ; dupptr exinfo, varptr(ctx(12)), 49 * 4 ; prm = varptr(exinfo) prm = ctx(219) res = callfunc(prm, _qreset@, 1) return; res #deffunc qdraw int p2 mref ctx, 68 ; dupptr exinfo, varptr(ctx(12)), 49 * 4 ; prm = varptr(exinfo),p2 prm = ctx(219),p2 res = callfunc(prm, _qdraw@, 2) return; res



p、USAGI

リンク

2009/8/29(Sat) 02:38:50|NO.27383

>ANTARESさん
ありがとうございます。
とりあえず壁を表示させることに成功しました。

最初の質問が解決いたしましたので、解決にチェックします。


もし、まだお付き合いしてくださるなら今度は qaddpoly を
成功させていだだけないでしょうか?
(図々しいのは承知しておりますので無視して頂いて構いません)

GetProcAddress hobaq,"_qaddpoly@16" : _qaddpoly = stat ;〜省略〜 #deffunc qaddpoly var p1,int p2,int p3,int p4,int p5,int p6,int p7,int p8,int p9,int p10,int p11 mref ctx, 68 prm = ctx(219) ;varptr(p1),p2,p3,p4,p5,p6,p7,p8,p9,p10,p11 res = callfunc(prm, _qaddpoly@, 1) return ;〜省略〜 boxf qreset ; 初期化 ;qaddpoly my, 3, 100,50, 0.0 ,10.0,10.0,1,1,0,0 ; 三角形を追加 qdraw 0 ; オブジェクトの描画 redraw 1 ; 壁と三角形が表示されたら成功です
prmにctx(219)を代入すると、
エラー23 "変数名が指定されていません"
が発生し、かと言って varptr(p1) などを代入すると、
>Hsp3 が原因で <不明> にエラーが発生しました。Hsp3は終了します。
>問題が解決しない場合は、コンピュータを再起動してください。
と表示されてしまいます。
うーん、なにを入れればいいのか…



ANTARES

リンク

2009/8/29(Sat) 04:20:48|NO.27392

 試してないけど
prm = ctx(219),p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11
でいいんじゃないですか?

 なお、1〜6行をモジュールの外に出してる意味がわかりません。
qresetの中に入れれば「_qreset@」等の「@」もいらなくなるし。



p、USAGI

リンク

2009/8/29(Sat) 06:34:42|NO.27396

>ANTARESさん
お返事有難うございます。

> 試してないけど
>prm = ctx(219),p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11
>でいいんじゃないですか?
エラー23 "変数名が指定されていません"
が発生します。


> なお、1〜6行をモジュールの外に出してる意味がわかりません。
>qresetの中に入れれば「_qreset@」等の「@」もいらなくなるし。
指摘されて気付きました。
モジュール内に入れた方が良かったですね、申し訳ないです。
元々同じモジュール空間に入れていたものを質問用に変更したので。
EXEにパックすることが目標なのでDLLを外にコピーしたり、
不要になったDLLを削除したりするので別の命令の中で処理させる予定です。
なのでNO.27366のスクリプトに「@」を入れ忘れていたのもそのせいです。



ANTARES

リンク

2009/8/29(Sat) 10:37:14|NO.27401

>prm = ctx(219),p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11
 よく考えたら、これじゃp1の値が渡されるだけなんで
ダメに決まってますね(^_^;;

 Pval構造体のポインタを渡してみることも試してみましたが
ダメでした。

 通常の呼び出しでは、パラメータが変数の場合、その変数の
ポインタやPVal構造体のポインタを必要な場所にセットし、
DLLがそれらを要求する関数を呼び出したら、その情報がセット
されているかをチェックして、セットされていればそれを
返していると考えられます。
 そうだとすると、prmにp1という変数そのもの(またはC++等で
いう参照)をセットする必要がありますが、HSPではそんなことは
不可能なので、変数を指定する関数の呼び出しも不可能と
いうことになります。

 なぜ、#funcを使う方法はダメなのですか?
それがわかれば、別の解決方法があるかもしれません。



ONION software Copyright 1997-2023(c) All rights reserved.