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


HSPTV!掲示板


未解決 解決 停止 削除要請

2012
1112
shougunsC++で作成したDLLをHSPで参照渡し(char)7未解決


shouguns

リンク

2012/11/12(Mon) 17:43:00|NO.50597

こんにちは

C++言語でDLLを書いてHSPで使っています。
DLL自体は動くのですが、関数の参照渡しをしようとするとうまくいきません。

----------------------------------
VOID WINAPI TEST(int& num)
{
num = 123;
return;
}
-----------------------------------
↑とC++で書き、
HSPで
-----------------------------------
TEST varptr(num)
-----------------------------------

と書くとnumに『123』と出力されます。

しかしchar等で同じことをすると
アドレスのような数値が出力されてうまくいきません。
文字列等を出力したいのですが
それは可能でしょうか?また実現が可能であれば手順を詳しく教えてください。



この記事に返信する


skyblue

リンク

2012/11/12(Mon) 18:43:12|NO.50599

参照渡しはメモリアドレス(文字列などのポインタ)を渡すものであり
文字列などを渡すのは値渡しです。



shouguns

リンク

2012/11/12(Mon) 19:12:14|NO.50604

>>skyblue様
文字列等を渡すのは値渡しというのですね!失礼しました!
もう一度調べなおして試行錯誤しながら学んでみようと思います!
回答ありがとうございました!



3k

リンク

2012/11/12(Mon) 20:32:30|NO.50606

う…うぅむ…む…値渡し…? ぅ…


参照とポインタは規格上は違う概念です。
実際問題、参照の実装がポインタを用いているのが一般的であるだけなので、
HSP側に公開するなら素直に参照ではなくポインタを受け取った方がよいと思うのですが…。
 (今回のコードは「たまたまうまく動いた」だけで、
  全てのコンパイラが同じコードを吐くかどうかは若干微妙な気がします。)


それは置いといて。

> しかしchar等で同じことをすると
> アドレスのような数値が出力されてうまくいきません。
どういう処理をさせているのか分かりませんが、
charの場合は指しているメモリ領域を書き換えて行かないといけないので、
HSPのように単純に「string = "test";」のように書いても動きませんよ。

例えば


// C++側 VOID WINAPI set_text( char* p ) { strcpy( p, "test" ); } // HSP側 set_text varptr(text)

な感じになります。

ただし、HSPから渡した文字列型変数の大きさが十分に大きくないと大変なことになるので、そこだけは注意を。
「何のことかよくわからん!」という場合は、色々なパターン、
特に長い文字列をDLL側からコピーしてみるコードをかいて実験してみるといいかもしれません。



それと、少し趣旨が外れますがDLLではなく”HSP専用のDLL(HPI)”のソースのサンプルなら、
HSPをインストールしたフォルダ内の「hspsdk\hpi3sample」などにあったりします。

HSP専用のDLLの場合は可変長の引数を受け取れたり、
受け取った変数の型を変更したりできる他、
コマンド形式と関数形式とどちらの書き方でも呼び出せる関数が書けたりするので、
特にHSP以外で使わないというならそちらの形式で作ってみると使いやすいDLLが出来るかもしれません。
 (その分少々敷居があがっちゃったりしますが)


以上、頑張ってください。



shouguns

リンク

2012/11/13(Tue) 15:49:52|NO.50627

>>3k様
僕がやりたかったのはそれです!
アドレスを受け取ってstrcopyを使えばいいだけだったんですね………。
全く応用が利かず行き詰っていました…。
C++のポインタに関する知識が曖昧な上に色んなことをしようとして
ゴチャゴチャになってしまいました…。これからはもう少し学んだ上で
質問をしようと思います。ありがとうございました。



check

リンク

2012/11/13(Tue) 21:42:49|NO.50629

俺はstrcpyは使うのはやめたほうがいいと思うが。


#define TEXTDATA "hoge" /* テキストデータ */ int WINAPI set_text(char* str) { if (str == NULL) return strlen(TEXTDATA); strncpy(str, TEXTDATA, strlen(TEXTDATA); return 0; }
これなんかどうだ。



check

リンク

2012/11/13(Tue) 21:44:35|NO.50630

set_text関数の引数を0(所謂NULL)に指定すると、
statにコピーしたいテキストの長さが返ってくるので、sdimでその分だけ確保してやればいい。



ANTARES

リンク

2012/11/14(Wed) 01:36:54|NO.50633

strncpyはターミネータを書き込まないのでバグの元です。
strncpyを使う場合は必ず事前にバッファをゼロクリアする必要があります。

【誤】sdimでその分だけ確保してやればいい。
【正】sdimでその分+1だけ確保してやればいい。
ターミネータ分を確保しておかないと、出たり出なかったりする
正体不明のバグに悩まされることになります。
 まあ、hspは最低64バイト確保するので、それ未満なら実害は出ませんが。



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