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


HSPTV!掲示板


未解決 解決 停止 削除要請

2007
0316
tnrHPIで文字列を返したいです9解決


tnr

リンク

2007/3/16(Fri) 10:25:33|NO.6331

こんにちわ
hspSDKについて質問があります。

資料が少なく(wikiには目を通しました)手探りな状態で困っています。

やりたいことは、
HSPから、文字列と数値型変数を引数に渡し、
DLL側で受け取った文字列を加工して返したいです。

〜HSP側〜

変数s = 登録関数名( 文字列, 変数i )

変数s :加工された文字列を受け取る
変数i :次の読み込み位置

これは、HSPのdefcfuncにより実現できました。

今回はこれを使ってSDKの勉強をしたいと思ってます。


これをDLLにすると、どうしても文字列を返すことができません。

引数は受け取ることができました。
また数値型なら

stat = 〜 ;
return;

(make hpi 2 参考 )

で返すことができました。
文字列は、

char *s;

stat = (int)s;
return;

で返せるかと思ったんですが、無理みたいです。

どうすればいいのか、全く分からなくなってしまったので、
お力をお貸ししていただければ幸いです。

どうぞよろしくお願いします。



この記事に返信する


YOYO

リンク

2007/3/16(Fri) 12:24:16|NO.6334

>資料が少なく(wikiには目を通しました)手探りな状態で困っています。
HSPSDK内のhspdll.txtを読めば全部書いてあると思うので、一通り読んでみればいいのでは?
さっき少し読んだところ、466行目から値を返す方法が書いてありました。



Irisawa

リンク

2007/3/16(Fri) 13:48:29|NO.6336

文字列は文字列用のバッファにポインタを格納して返します。
これが結構分かりにくく、ややこしいんですよね。
指定された文字列をただ返すだけなら以下のような感じです。
動作検証はしていませんので実行結果などは保証しかねます。
何かおかしいところや問題点などがあるかもしれませんがご了承ください。


static void *reffunc( int *type_res, int cmd ) { if ( *type != TYPE_MARK ) puterror( HSPERR_INVALID_FUNCPARAM ); if ( *val != '(' ) puterror( HSPERR_INVALID_FUNCPARAM ); code_next(); void *ptr; switch( cmd ) { // サブコマンドごとの分岐 case 0x00: char *s; s = code_gets(); // 文字列を取得(デフォルトなし) ptr = hspmalloc(lstrlen(s)); // バッファ確保 lstrcpy((LPSTR)ptr, s); *type_res = HSPVAR_FLAG_STR; // 返値のタイプを文字列に指定する break; default: puterror( HSPERR_UNSUPPORTED_FUNCTION ); } if ( *type != TYPE_MARK ) puterror( HSPERR_INVALID_FUNCPARAM ); if ( *val != ')' ) puterror( HSPERR_INVALID_FUNCPARAM ); code_next(); return ptr; }



tnr

リンク

2007/3/21(Wed) 07:44:27|NO.6455

返信ありがとうございます

そして、こちらからの返信遅れて申し訳ありません


>YOYO様
最新のSDK付属の説明書はより詳しく書いてあるのですね。
持っていたものは少し古いバージョンでしたm(__)m


>Irisawa様
サンプルプログラムありがとうございますm(__)m

「できた」という返事を出したかったのですが、
Cの知識が少ないので
なかなかコンパイルに成功しません(涙

試行錯誤しながらですので、まだ時間がかかりそうです。


完全な知識不足です。
すみません。

当然ですが、
動作したらすぐ報告させていただきます。



kz3

リンク

2007/3/21(Wed) 08:21:16|NO.6456

>Cの知識が少ないので

単に「プラグインを作ってみたい」ではなく「Cを勉強したい」というならプラグイン作りはお預けにしておいて、先にCの基礎を固めたほうがいいと思います。
とは言ってもHSPからCに以降しても演算子などはHSPもCもほとんど同じなので、はじめてのプログラミングがC言語だった人よりは飲み込みやすいのではないでしょうか。

とりあえずこちらなんかどうでしょう。教科書っぽい構成がすきです^^;
=>初心者のためのポイント学習C言語(http://www9.plala.or.jp/sgwr-t/)

# C言語は分かるという話だとプラグイン作りの話を掘り下げていいのかも知れないけど。

>なかなかコンパイルに成功しません(涙

コンパイラはたくさん種類があるので、コンパイル作業はCの知識以外にもコンパイラの知識も必要です。

# とりあえずHSP開発wiki:MakeHPI/cpp/chapter1から...。



tnr

リンク

2007/3/21(Wed) 08:55:15|NO.6457

>kz3様

URL含め、アドバイスありがとうございます。

Cを使ってソフトを製作したことはないのですが、
一応、このサイトの知識はギリギリあると思います。

あと、wikiにあるサンプルは、chapter3まで自分で作れました(^^
実際に正常動作します。

WIN32APIもHSPを使っているうちに理解でき、
コツも分かってきました。


そろそろウインドウズプログラミングがしてみたいなぁと思います。

本当は、今開発しているソフトを移植したいんですけど、
ウィンドウズプログラミングの仕組み(ウインドウプロシージャー等)
にどうやってHSPの動作を再現できるのかが全く分かりません。

ですので、一部一部をDLLにして、
少しずつやっていけたらなぁと思ってます。

その際、HSPユーザの助けになるものが出来たら
いいな、とも考えております。

これからもよろしくお願いしますm(__)m



kz3

リンク

2007/3/21(Wed) 23:58:24|NO.6472

HSP開発wiki:MakeHPI/cpp/chapter4を更新しました。
文字列を返す関数としての説明を追加しました。作っているプラグインに合わせて読み替えてみてください。
基本的にはIrisawaさんと一緒です。(Irisawaさんのはバッファサイズにヌル文字分忘れてる)

chapter4で無事HPIを作ることができて動作結果も問題ない場合は、tnrさんの作っているプラグインソースに間違いがあるのかも知れませんね。

# HPIとC言語の文法の話は微妙ですね。
# 場違いだとつっこまれるのを覚悟で話を掘り下げる?掘り下げるなら使用コンパイラとかコンパイラメッセージとか必須。
# 開発wikiにコメントするとか。



tnr

リンク

2007/3/22(Thu) 04:43:06|NO.6475

>kz3様

chapter4の更新、とても参考になりました。

ありがとうございます。

教えて頂いたサイトを読んで確認したせいか、
おかげさまで無事コンパイルに成功致しましたm(__)m

それから、HSP側に返すポインタが自動変数だったので、
それも原因だったと思います。


HSPから呼び出してみると、
ちゃんと動いていると思います。


DLL内では、関数形式・命令形式の両方が存在し、
さらに戻り値もint, double, strとあるので大変です。

まとめてみますので、
完成したら是非ソースコードを見てもらえませんでしょうか?



kz3

リンク

2007/3/22(Thu) 05:30:19|NO.6476

>完成したら是非ソースコードを見てもらえませんでしょうか?

何が問題だったのかは書いてることだし、掲示板ではなるべく長くなるようなソースは載せないほうがいいでしょう。

もしHSP開発wiki内のソースが役にたったのでしたら私ではなくHSP開発wikiに還元されたほうがよいかと思います。
ともかく、コンパイルに成功してよかったです。プラグイン作りがんばってください。



tnr

リンク

2007/3/22(Thu) 07:01:18|NO.6477

>kz3様

分かりました。
確かに、どうしても長くなってしまいそうです。

もし何かあったら、wikiに書き込むようにします。

>YOYO様
>Irisawa様
>kz3様

皆様のおかげで、
プラグイン作成に取り掛かれそうです。

どうもありがとうございましたm(__)m
とても感謝しております。



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