|
|
2009/8/25(Tue) 23:08:34|NO.27304
HSPEXINFO構造体(へのポインタ)を取得したいのですが、どうすれば良いのでしょうか?
HSPEXINFO = HSPEXINFO構造体?
prm = varptr(HSPEXINFO)
res = callfunc(prm, xxx, 1)
この様にしてDLLに渡したいです。
|
|
2009/8/26(Wed) 00:19:06|NO.27309
mref命令のHSPCTX構造体経由で取得できます。
|
|
2009/8/26(Wed) 02:03:05|NO.27320
あるいは
#uselib "DLL名"
#func 好きな名前 xxx $202
好きな名前 p1,p2,p3,……: rt=stat
rs=refstr
|
|
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
|
|
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 → 関数 と読み替えていいのでしょうか。
|
|
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 ; 壁が表示されたら成功です
|
|
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
|
|
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は終了します。
>問題が解決しない場合は、コンピュータを再起動してください。
と表示されてしまいます。
うーん、なにを入れればいいのか…
|
|
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@」等の「@」もいらなくなるし。
|
|
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のスクリプトに「@」を入れ忘れていたのもそのせいです。
|
|
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を使う方法はダメなのですか?
それがわかれば、別の解決方法があるかもしれません。
|
|