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


HSPTV!掲示板


未解決 解決 停止 削除要請

2018
0629
Y_repeatHSPとCとの連携19解決


Y_repeat

リンク

2018/6/29(Fri) 01:49:41|NO.84657

HSPとCとの連携は自分のなんとなくのテーマなんですけど
あんまり上手く行っていません

今回はCのメインルーチンとHSPのGUIで連携する作戦です
CはMinGWでいこうと思っています

CをDLL化するのではなく(MinGWだとよくわからないので)
共有メモリ、クリップボード、ファイル入出力 なかんじでいく作戦です
共有メモリ、クリップボードはググったらHSP側は出来そうですが
MinGWの方はよくわかんなくてですね

ファイル入出力で連携したいです

一応、ググったんですけど 検索下手な自分ではひっかからず
参考サイトとか 連携の骨組みとか
御教授賜りたいです

ではでは



この記事に返信する


Hikaru

リンク

2018/6/29(Fri) 03:29:05|NO.84659

>Y_repeatさん
>MinGWの方はよくわかんなくてですね
C言語は、コンパイラによっては独自機能もあったりもしますが、
通常はコンパイラによって機能が左右されることはありません。
ちなみに僕は、gcc (MinGW.org GCC-6.3.0-1) 6.3.0を使ってます。
MinGWにもCコンパイラついてるんですね。
ただ、C++コンパイラがメインのようなので、
gccにくらべると機能は劣る?
まあ、頑張ってください!



リンク

2018/6/30(Sat) 09:41:53|NO.84671

単一ソースからなら
gcc -shared src.c -o library.dll [スタティックリンクたち]
複数オブジェクトからなら
gcc -shared [スペース区切りでオブジェクトファイルたち] -o library.dll [スタティックリンクたち]
でdllができます。
dllの関数をhspから使うには、Cのソースファイルの先頭で
#define dll __declspec(dllexport)
などとしておいて、
dll int test_func(int a, int b){return a+b;}
のように、先頭に dll を付ければ、#func で登録できるようになります。



リンク

2018/6/30(Sat) 09:45:17|NO.84672

言い忘れました。
minGW gcc 6 系列では、そのままdllを作ると、無駄にサイズが大きいバイナリができるので、リリースする際には strip library.dll などとしてデバッグ情報を削除してあげると大幅にダイエットできます。あるいは、
gcc -shared hoge.c -o library.dll || strip library.dll
こんな感じでつなげると、勝手にやってくれます。



Y_repeat

リンク

2018/7/1(Sun) 03:41:23|NO.84693

こんばんわ。返信ありがとうございます

http://prograpark.ninja-web.net/HSP/hpi/n00.html
>HSPSDK
>HSP3プラグインを開発する時は、専用のSDK、HSPSDKを使用します。
>これを使うと、HSPのシステム( ランタイム )の情報に、間接的ながら触ることができます。
コレをLINKしてくださいみたいに書いてるんですが
システムに触る気がないなら使わなくていいんですか?

講座ではbccの開発環境でインストールに含めてて
mingwだとバッチファイルにしたらいいんでしょうか?
使わなくてもいいなら使わないに越したことないんですが

HSPはI/O的に使おうと考えてたんですけど
dllだとやっぱりメインにする全体像が浮かばないんですよね
そのためにファイルを介してアクセスしようと思ったんですが

さっきググってたらminGWでQtを使うとか書いてて
HSPにこだわんなくてもいいのかな?とも思い

コンテストは10年近くやってる気しますが
未だに入賞経験ないですし
HSPに適正ないのかなーとも 思うんですよね



リンク

2018/7/2(Mon) 08:34:35|NO.84705

私はリンクしたことがないです。
というより、HSPのプロジェクトやヘッダーはVisual Studio用かもしれないので、もしかするとminGWでエラーになる可能性があります。試していませんが!



skyblue

リンク

2018/7/2(Mon) 12:32:14|NO.84706

hspsdkは必須では有りません。
hpiという、HSP専用DLLを作る時だけです。



科学太郎

リンク

2018/7/2(Mon) 12:47:29|NO.84707

> HSPとCとの連携は自分のなんとなくのテーマなんですけど
このCとは、C言語で作成されたDLLのことかな?
そして、そのDLLをHSP側で呼び出して使うのか?

> 今回はCのメインルーチンとHSPのGUIで連携する作戦です
これは、DLLのメインなのか?
それとも1つの命令のメインルーチンの事かな?

> 共有メモリ、クリップボード、ファイル入出力 なかんじでいく作戦です
> 共有メモリ、クリップボードはググったらHSP側は出来そうですが
これは、Windows API などを HSP 側で簡単に
共有メモリやクリップボードを使うための方法という意味でしょうか?

基本的に C 言語で複数の便利な命令を DLL ファイルとして用意して
HSP で呼び出すことをテーマにしてるのでしょうかね。



Y_repeat

リンク

2018/7/2(Mon) 18:06:35|NO.84709

こんにちわ。返信ありがとうございます

やりたいことは
HSPからC(dll)を呼び出すんじゃなくて
メインルーチンはC側に合って
CのI/OのようにHSPを使いたいです

HSP起動dllの命令呼び出し
の逆で
Cを起動 ボタン操作 inputボックス操作をしたい時に
サブルーチンとなってるHSP側の命令を Cから呼び出す。です

操作は選択をしたい時に
HSPのサブルーチンを呼び出す
ボタンを押してボタンID返す

何か入力して欲しい時に
inputに入力してもらってNEXTボタンを押してもらうと
C版メインに文字列を返す

アウトプットとしては
HSPにmesboxを用意して
サブルーチンを呼び出して
引数(じゃなくてもいいんですけど)
に入ってる文字列をmesboxに表示する等です

と、仕様は大体決まってるんですが
実現方法が上手く思いつかなくて
そういう時の 定石とか あったら教えて欲しいなあ
と、思ったのでした



あらや

リンク

2018/7/2(Mon) 19:05:09|NO.84710

どちらかというとCをメインにして、HSPをDLL的に使うという感じですか。
いわゆる『パイプ付き実行』が一番手っ取り早いのではないでしょうか。

C側からパイプ付き実行でHSPの実行ファイルを起動

HSP側はoncmdなんかの割り込み処理を受けてサブルーチンの実行

みたいな事を出来たら実現できそうな気がしますが
やったことが無いので正直わかりません。

そもそもHSPは外部からのコマンドを受け取って何かするというようなDLL的な機能が
あまり無いのでネットワーク系のサーバー(もしくはクライアント)プログラムのように
組むのがいいかもしれないです。



まー、正直GUIはHSPの方が手っ取り早く出来るというのはわかるのですが
別のコンパイラを使ってCをDLL化してHSPで呼び出すとかした方が手軽だと思います。


>コンテストは10年近くやってる気しますが
>未だに入賞経験ないですし
>HSPに適正ないのかなーとも 思うんですよね
私が審査している訳ではないですが、コンテストはHSPの適正というよりも
発想力なんかの方が重要なような……。

他言語を否定する訳ではないですが、
「HSPでこんなことができるのか!」というような
目を引く作品が作れたら入賞も出来るかもしれません。
(その目を引く作品というのがなかなか思いつかないんですけどね)



科学太郎

リンク

2018/7/2(Mon) 20:51:39|NO.84713

> メインルーチンはC側に合って
> CのI/OのようにHSPを使いたいです
何となく分かった気がするぞ。

つまり、C言語で作成されたプログラム(A.exe)から
HSP言語で作成された一連のプログラム(B.exe)を
操作する構造ですね。

プロセス間通信でネット検索かけたり、
WM_COPYDATAメッセージで検索かけてみるとか。

・WM_COPYDATA
http://chokuto.ifdef.jp/advanced/message/WM_COPYDATA.html

・メッセージによるプロセス間通信
http://chokuto.ifdef.jp/advanced/copydata.html

・アプリ間データの送受信
http://www.geocities.co.jp/SiliconValley-Cupertino/3384/WindowsC.html#appli

・プロセス間通信
http://eternalwindows.jp/winbase/window/window16.html



Y_repeat

リンク

2018/7/7(Sat) 21:23:28|NO.84732

返信ありがとうございました
CをメインにHSPをdll的な仕様する人はほとんどいないってことですか?

APIとか全然書いたことがなく
いきなり自力で書くのはまだ無理と思い
LINK先をイメージしながら
ファイルの入出力で連携していこうと思います
LINK先も複雑っぽいですが
それでも簡単な処理っぽいサンプルなので
サンプルスクリプトを書いてもらっても
それより簡単にはならないかもしれませんね

同じファイルに同時アクセスとかでアクセスに失敗すると
Cは-1が返ってきて50ミリ秒くらい待ってアクセスしようと思っています
HSPは「HSP bload 失敗」でググっても全然情報出ませんでした
たぶんerror12が起きてonerrorでwparamが12ならawait 50して再アクセスってかんじなんすか?

他に御指導等ありましたら
気楽に返信お願い致します



Velgail

リンク

2018/7/7(Sat) 23:41:20|NO.84733

ぶっちゃけこの方法なら、まずはプロトタイピングにPythonでも使えばとしか……

で、移植実装時にC言語の辛さを嫌でも味わうということになるけど。
(C++でDLLを作るほうが、私としてはMillion倍くらいマシ)



Y_repeat

リンク

2018/7/8(Sun) 16:03:20|NO.84736

こんにちわ。返信ありがとうございます→Velgailさん

実は、共有メモリとかクリップボード経由を敬遠した
ちょっとした理由も
ファイル経由ならPYTHONでも実相出来そうだな。とは思いました
RubyはCと相性良さそうですし

Cをメインに据えたい理由は
将来的にはyacc/Lexをメインに据えたいというのがありまして
さすがにJAVAがその分野の中心に移行しつつあるっぽいですが
バージョンの違いによる違いが大きそうで…

Cをメインに据えたなら
処理はC++のファイルをインクルードして丸投げするのも一つの手ですね

Pythonで書いたらCへの移植は難しいとうのも なんとなくわかります
逆にCからPythonへの移植はある程度楽そうですよね

実は決定したようで 全然決定出来てなかったり
でもそろそろ決定しないと実装に進めないかんじでもあるんですが

書いたHSPスクリプトにコメント書きでもしながら
もう少し考えてみるのもいいかもしれません



MIZUSHIKI

リンク

2018/7/9(Mon) 19:59:44|NO.84738

似たような思想のものだと"GUIフロントエンド"が近いと思います。

例えば少し古いですが「携帯動画変換君」とかでしょうか。
(他は「GUIフロントエンド フリーソフト」辺りで検索。)

このソフトは、
ffmpeg.exe(処理メインの実行ファイル)に、コマンドラインを使って以下のようなもの(Input)を投げます。
ffmpeg.exe -i hoge.wmv -vcodec h264 -b 400k -acodec aac -ac 2 -ar 48000 -ab 64k fuga.mp4
で、ffmpeg.exeから成果物(変換後の動画ファイル)が出力(Output)される。と。

Y_repeatさんの場合は、
・処理メインのC言語のexeは起動しっぱなし。
・HSPのexe側から、ファイルパスや設定値などのInputを"なんらかの方法"で渡して、
 C言語のexe側から、処理結果の文字列や数値等のOutputを、HSPのexe側に"なんらかの方法"で返したい。
という認識で良いでしょうか。

その場合 私個人としては、科学太郎さんが紹介してくれた"WM_COPYDATA"を使う方法が良さそうに見えます。

私も"WM_COPYDATA"は使ったことがなく、今回初めて知ったのですが、
お互いのウィンドウハンドルさえ分かってしまえば、
あとは自由自在にどうとでもデータの受け渡しが出来そうな印象です。

C側もHSP側も"WM_COPYDATA"ウィンドウメッセージを捕まえたタイミングで処理すればいいので、
ファイルの入出力等で連携するよりも処理のタイミングに困ることは無いと思います。


情報が多くてなんか難しい><; と感じるなら、科学太郎さんが紹介してくれた
 ・メッセージによるプロセス間通信
  http://chokuto.ifdef.jp/advanced/copydata.html
の、「任意サイズのバイナリデータを渡す:WM_COPYDATA」のところだけをまずは読んでみると良いと思います。
ここだけならそこまで難しすぎることはないと思います。

お互いのウィンドウハンドルを知る手順としては、以下のような形で行けそう。
・C言語exeを本体として、ユーザーに実行してもらう。
 1. C言語exeの初回起動時に、"C側のウィンドウハンドル"をコマンドライン引数としてHSP側exeを実行。
 2. HSP側は"C側のウィンドウハンドル"目掛けて"HSP側(自身)のウィンドウハンドル"をsendmsg。
 3. C言語exeがそれを受け取ったら、無事お互いのウィンドウハンドルが取得できた。

OutputをまたGUIで受け取る、というのは面白い発想だと思います。頑張ってみてください。



Y_repeat

リンク

2018/7/10(Tue) 23:35:46|NO.84744

返信ありがとうございます
ちょくとさんとこのLINK先、プリントアウトして読みました
そろそろ ちょくとさんとこのサイトをざっくり目を通した方がいい
時期なのでしょうか
一回挫折してるんですが
アレですよね
最近思うんですが
プログラミングって哲学ではなく スキルであり、学問だって
思うんですよね
そう割り切ろうと思ってから 読む視野が広がった気がします

で、exe(C)とGUI(HSP)で分割するとして
exeもHSPのdllとした方が操作しやすいかな?と思いました
しかし、それなら分割しないで
GUI(サブ)とdll(メイン)
で役割分担するだけでいいのかな?と思って
しかし、dll(メイン)を起動しっぱなしってどう実現しようかな?
と思ったんですが
スレッドを新しく立てて 新スレッドでメインループ+
WM_COPYDATAをイメージした構造体の更新
構造体のデータで分岐して処理→メインループへ

ってとこが現在考えてる地点です
眠くなってきてはしょっちゃってます



Velgail

リンク

2018/7/10(Tue) 23:58:41|NO.84745

というか、まずはHSPとHSPを同時起動でつなげてみてはいかが?
http://hsp.tv/play/pforum.php?mode=pastwch&num=69673

なんか思い出した懐かしいものです。参考になる部分はあるはず。



Y_repeat

リンク

2018/7/11(Wed) 02:21:59|NO.84747

簡単すぎる例かもしれませんが、逆に簡単なのから始めた方がいいのかな?ってんで
サンプルスクリプトです
このサンプルスクリプトをGUIとメインに分割しようと思います
あんまりゲームのスクリプト公開しないんですが^^;
自分の小規模ゲームの構造はなんとなく似てますね
http://zuzazann.main.jp/wiki4/index.php?GUI%A4%C8%A5%E1%A5%A4%A5%F3%CA%AC%B3%E4%BD%E8%CD%FD%A1%A3%A4%BF%A4%BF%A4%AD%C2%E6



Y_repeat

リンク

2018/7/13(Fri) 00:11:38|NO.84750

こんばんわ
自分dll側でループさせることに拘りすぎていました

書くスクリプトをなんとなくイメージして
WM_COPYDATAをイメージして
ボタン表示文字列とかを受け取って
ボタン識別IDも受け取って
押したボタン識別IDを渡すかんじで

自分、大体I/Oはボタンとmesboxなので
分割しなくてもdllに処理を渡せそうです

I/OはWM_COPYDATAをイメージして
渡すのも受け取るのも出来る御用聞き関数を使って
どうせWM_COPYDATAっぽくやりとりするし

色々ありがとうございました



Y_repeat

リンク

2018/7/14(Sat) 16:38:06|NO.84772

質問だけして 結論があやふやになっちゃったかんじなので

なんで御用聞き関数で解決したのかというと
普通、関数ってなんか仕事するじゃないですか
しかし、御用聞きってことで、仕事をもらってくるんです

流れでいうと

dll呼び出し。初期化処理

御用聞き関数
たぶんdll側のメインルーチン始まる
メインルーチン動く
メインルーチンでmesboxとかmesしたいアウトプット。の依頼が生じる
御用聞き関数のchar変数配列に依頼の文字列入れて 御用聞き関数からreturnする
メインルーチン一時停止
HSPでアウトプット
また御用聞き関数呼び出す
メインルーチン再開
メインルーチンでボタン選択の依頼が生じる
御用聞き関数のchar変数配列に\n区切りで
button表示文字列とbutton選択ID入れて 御用聞き関数からreturnする
メインルーチン一時停止
HSP側でbutton描画
「exit」button押したとする
御用聞き関数でexit押したと伝える
mallocしてた領域とかあったら破棄
御用聞き関数からreturnする
プログラム終了
メインルーチンは一時停止っつーか
御用聞き関数はreturnしてるので終わってもたぶん大丈夫

といった例で
outputもbuttonのinputも処理出来るので大丈夫そうです
outputは御用聞き関数でoutput依頼をもらいoutputしてもう一回御用聞き関数呼び出し
inputは御用聞き関数でbutton依頼をもらい結果を変数引数に入れて
もう一回御用聞き関数呼び出し

ということで処理をexeとかの分割せずに
メインルーチンを構築出来そうです



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