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


HSPTV!掲示板


未解決 解決 停止 削除要請

2017
0121
yaydll 可変長引数 #func5解決


yay

リンク

2017/1/21(Sat) 17:52:30|NO.77996

可変長引数をとる関数がDLLから公開されている場合、#funcの定義はどうしたらいいでしょうか。

Cで書かれたDLLがありまして、そこでは可変長引数をとる関数がエクスポートされているようです。
ヘッダのプロトタイプ宣言では、
__declspec(dllexport) const char *(f) (int a, const char *b, ...);
となっているのですが、hspでの#funcでは、va_listを受け取っているものとして
#func f "f" int, sptr, int
でいいのでしょうか。
よろしくお願いします。



この記事に返信する


MillkeySoftware

リンク

2017/1/21(Sat) 20:46:17|NO.77999

可変長の引数は、基本的に受け取る側で処理をします。
なので、HSPから呼び出す際は固定長で呼び出しても構いません。

#func f "f" int p1,int p2,int p3
#func f2 "f" int p1,int p2,str p3
#func f3 "f" int p1,str p2,int p3

など。相手先が引数を正しく処理できれば問題ありません。



yay

リンク

2017/1/22(Sun) 10:10:16|NO.78000

ありがとうございます。
ただ、私が使う関数はprintfのように任意の形の引数を任意の数とるような関数なので、
#func f "f" var p1
#func f2 "f" var p1, p2
#func f3 "f" var p1, p2, p3
...
と延々と書かなければなりません。
そのため、GetProcAddressとcallfuncで動的に呼び出すことにしました。
需要ないと思いますが、一応貼っておきます。

#module #uselib "kernel32.dll" #func LoadLibrary "LoadLibraryA" sptr #func FreeLibrary "FreeLibraryA" int #func GetProcAddress "GetProcAddress" int,sptr #deffunc vauselib str _filename vafreelib LoadLibrary _filename hModuleDll = stat return #deffunc vafreelib onexit if hModuleDll != 0 { FreeLibrary hModuleDll if stat == 0 { return -1 } } return 0 #deffunc vafunc var pProc, str _procName procName = _procName GetProcAddress hModuleDll, varptr(procName) if stat == 0 { return -1 } pProc = stat return 0 #deffunc vacall int _pProc, array params return callfunc(params, _pProc, length(params)) #global #if 0 vauselib "hogeDll.dll" vafunc f, "f" //__declspec(dllexport) const char *(f) (int a, const char *b, ...); s = "numbers are %d, %d, %d, %d" /* a */ /* *b */ /* ... */ prms = hoge, varptr(s), 3, 5, 2, 9 vacall f, prms mes stat #endif



yay

リンク

2017/1/22(Sun) 10:10:31|NO.78001

解決



eol

リンク

2017/1/23(Mon) 03:00:56|NO.78009

解決してますが情報を一つ。
HSPのdll関数呼び出し部のソースを見るとシンプルながらもよく考えられてます。
引数を多く渡しても大丈夫なようになってるので、使用するであろう最大数までintを設定しておけばいいです。

例としてCのprintfを使ったサンプル

#runtime "hsp3cl" #uselib "msvcrt.dll" #func printf "printf" str,int,int,int,int,int printf "引数無し\n" printf "引数1個 %d\n",0 printf "引数2個 %d,%d\n",1,2 printf "引数3個 %d,%d,%d\n",3,4,5



yay

リンク

2017/1/27(Fri) 20:00:50|NO.78086

すみません
いつの間にかご返信いただいているとは気づきませんでした。
貴重な情報ありがとうございます。
まさに思った通りのものです。
この方法を使わせていただきたいと思います。
よくできてるんですねー



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