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


HSPTV!掲示板


未解決 解決 停止 削除要請

2012
0209
hinanoバイナリデータを返すプラグイン命令の作り方3解決


hinano

リンク

2012/2/9(Thu) 16:25:40|NO.44779

C++でHSPプラフインの作り方を勉強しています。

バイナリデータを返すプラグイン命令の作り方が分からないので、
質問させてもらいます。

int len = code_geti();//データの長さは、引数で指定

PVal *pval;
APTR aptr;
aptr = code_getva( &pval );

char* data = (char*)hspmalloc(len);

loaddata(data);//バイナリデータをdataにロード
code_setva( pval, aptr, HSPVAR_FLAG_STR, data);

hspfree( data );

return;

こんなかんじなのかなと、書いたソースです。
HSP側からは、sdimで予めバッファを用意して、渡しています。

でも返ってくるデータは不完全で、途中までしか代入されません。
HSPVAR_FLAG_STRで文字列扱いされているから、
バイナリデータの0の部分が終端文字扱いされてしまうのかなと、
勝手に想像しています。

これは、どう解決したら良いでしょうか?

よろしくお願いします。



この記事に返信する


ザーメン

リンク

2012/2/10(Fri) 01:14:47|NO.44789

解決策かどうかはわかりませんが、hspvarprocをいじって独自型をつくってみては?



リンク

2012/2/10(Fri) 02:41:55|NO.44790

code_setvaで渡したあと,HSPVAR_FLAG_STRの代入処理はstrncpyかstrlen→memcpyっぽいので、
> でも返ってくるデータは不完全で、途中までしか代入されません。
> HSPVAR_FLAG_STRで文字列扱いされているから、
> バイナリデータの0の部分が終端文字扱いされてしまうのかなと、
> 勝手に想像しています。
はあってると思います。

肝心のバイナリとしての代入処理ですが、HSP側でメモリ確保が出来ているという前提を置くなら


int len = code_geti();//データの長さは、引数で指定 PVal* pval; APTR aptr = code_getva( &pval ); loaddata( data );//バイナリデータをdataにロード if ( pval->flag != HSPVAR_FLAG_STR ) { puterror( HSPERR_TYPE_MISMATCH );// STRじゃなかったら弾く } HspVarProc* hvp = getproc( pval->flag ); PDAT* pdat = hvp->GetPtr( pval );// 指定添字要素の先頭ポインタをとってくる、このへんはリファ見てください memcpy( pdat, data, len );// こぴー

当然、HSP側からはpeekとかによるバイナリの読み出しじゃないと0で切れます。

本当はバッファが溢れないかチェックのコードも書くべきなんですけどが、先述の通り「HSP側でメモリ確保が出来ている」という前提でやってます。
大して難しくないので、チェックのコードも書いてみることをお勧めします、プラグイン作成の勉強なら尚更。

ただ、HSPのプラグイン作る際に参照出来る資料って全然ないんですよねえ…頑張ってください。



hinano

リンク

2012/2/11(Sat) 22:18:32|NO.44803

kさん。
ありがとうございます!
思っていた通りの処理ができました。

HspVarProcというのを知らなかったので、今度はここを掘り下げて勉強してみたいと思います。
ありがとうございました!



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