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


HSPTV!掲示板


未解決 解決 停止 削除要請

2025
0216
ねんねこHSP3 for Linux/Raspberry PiでのHSP3拡張プラグインの使用3解決


ねんねこ

リンク

2025/2/16(Sun) 11:15:00|NO.103060

HSP3 for Linux/Raspberry PiでHSP3拡張プラグインが使えたら、面白いなぁと思います。
.soをロードする機能とか作れないんですかね?



この記事に返信する


zakki

リンク

2025/2/16(Sun) 19:50:34|NO.103062

soのロードは LoadLibrary を dlopen に、 GetProcAddress を dlsym に差し替えるだけなんですが、
今はアセンブラで書いてある任意引数の関数呼び出しあたりの対応が大変そうです。
WindowsとLinuxとJS上で、x86とarmで、それぞれ32bitと64bitにそれぞれ違うアーキテクチャとABIに対応するのは大変そうなので
libffiを導入しちゃうのがいいと思います。

あとWindows版JS版以外のほとんどの環境は64bitでしょうが、外部関数呼び出し機能が無かったのもあって
HSP64相当の対応が必要な箇所がちょいちょい漏れてる気がします。



zakki

リンク

2025/2/16(Sun) 20:21:03|NO.103064

切り分けができてませんでした。
恐らく#regcmd、#cmd命令対応は↑のようなdlopen/dlsym/dlcloseと64bitポインタ対応をやれば出来て、
#uselib、#func命令対応は外部ライブラリ無いと面倒そうですが使っても問題なければやるだけな雰囲気です。
AndroidやiOSも含めると複雑かもしれません。



zakki

リンク

2025/2/16(Sun) 23:15:33|NO.103065

とりあえずこんな感じで、libffiを使って #uselib 対応出来そうです。
Linux版のhspcmpはuselib使うと何かおかしいので、Windows版でax作ってLinux版で実行してみてください。
Ubuntu x86_64では動いてて、同じソースでラズパイOS 32bit/64bitも動くと楽しいんですがどうでしょう?


https://github.com/zakki/OpenHSP-fork/tree/plugin-ffi


#uselib "test.so" #cfunc test0 "func0" #cfunc test1 "func1" var,int,int,int repeat 10 mes "call test0" res=test0() mes "return " + res a = "abc" mes "call test1" res=test1(a,1,2,3) mes "return " + res mes res loop


// gcc -shared -fPIC -o test.so test.cpp #include <stdio.h> extern "C" { int count = 0; int func0() { printf("called func0() %d\n", count); return count++; } int func1(char *p0, int p1, int p2, int p3) { printf("called func1(%p, %d, %d, %d)\n", (void*)p0, p1, p2, p3); for (int i = 0; i < 10; i++) { if (p0 && p0[i]) { printf(" %d: %c\n", i, p0[i]); } else { break; } } return p1 + p2 + p3 + 12340000; } }



記事削除

記事NO.パスワード
(質問が解決したスレッドは他の利用者に活用してもらうため、削除しないようお願いします)

NO.103060への返信

マスコット

好きなマスコットを選んでください。

名前

e-mail
HOME
  1. 初めて利用する方は、HSP3掲示板の使い方をお読みください。
  2. 不要部分の多い長いスクリプトの投稿は ご遠慮ください。
  3. 書き込みは自動改行されません。適度に改行を入れてください。
  4. スクリプトは小文字の<pre>〜</pre>で囲むと見やすく表示できます。

削除用パスワード

エラー発生時、再送信すると二重送信になることがあります。
回答が得られたら、お礼書き込み時に[解決]チェックしてください。
SPAM防止のためURLから始まる文章は投稿できません。
SPAM防止のため英文字のみの本文を投稿することはできません。

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