おはようございます。キリンです。
マニアックなネタなので、ほとんどの人は興味がないと思いますが、
メモ代わりに記載しておきます・・・。
多分C++に詳しい人にとっては当たり前なのかもしれません><;
string型(char型)以外で、MQLからDLLへポインタ渡しすることは不可能なようです。
参照渡しは全ての型で不可能でした。
常にクリティカルエラーが表示されてしまい、MT4が落ちます。
さらに、MQLでstring型をDLLに渡すときは、
必ず前もって文字領域を確保しておかなければなりません。
たとえば、
string text = "123456789";
とすれば、char[10]に対応しますが、
string text = "1234"+"56789";
このようにすると、"1234"分、char[5]分しか確保されませんでした。
また、定義時に割り当てておかないと、全く確保されないようです。
さらに、同じ定数を割り当てると同一メモリに保存されてしまいます。
string text1 = "123456789";
string text2 = "123456789";
とすると、text1をDLLへ渡して、特定のメモリの値を変えてやると、
たとえば、DLL側でchar* text1としたとして、
*(text1+3) = ‘e’;
とすると、text2の表示も
"012e456789"
と3番目の表示が変わってしまいます。
まったく同じ定数を割り当てた変数は、同一メモリが使われているようです。
なので、メモリ確保するときは1文字でも違う定数を割り当てなければなりません。
具体的には、
string text1 = "123456789"
string text2 = "123456780"
のようにする必要がありました。
今はboolの結果が欲しいだけでも、string⇒char型にして無理やりDLLに渡しています。
この情報は誰かの役に立つのかな・・・
以上、参考情報でした。
お読みくださり、ありがとうございます。
コメント
SECRET: 0
PASS:
おぉ。
この話はどっかのブログで見た事あるな。
そんなところまではまだ手が出ないっすが、これからの為に押さえておきます!!
SECRET: 0
PASS:
・変数宣言時の演算子の優先順位
・キャストとポインター操作
プログラマは、不可解な謎の答えは自分自身で見つけ出すものですからここに答えは書きません。
自分で問題解決した後のαテストが一番楽しいですね。
SECRET: 0
PASS:
配列にすれば行けます。
【MQL4】
#import "TestBool.dll"
void TestBool(bool b[], int);
#import
bool b[] = { true };
TestBool(b, ArraySize(b));
if(b[0])
{
Print("true");
}
else
{
Print("false");
}
【DLL】
MT4_EXPFUNC void __stdcall TestBool(bool b[], int size)
{
if(b == NULL)
{
return;
}
if(size < 1)
{
return;
}
b[0] = false;
}
何だか良く分からないですが、こんなことするぐらいであれば、戻り値で受け取った方が良い気がするのですが…。
MQL4ではこういう仕様の様ですね。
intやdouble等でも同様です。
SECRET: 0
PASS:
>SeaStarさん
アドバイスありがとうございます。
配列でできるのは分かるのですが、
やりたかったのは「参照渡し」なんですよ^^;
それができなかったので苦肉の策でポインタ渡しにしようと思ったわけです。
bool型は値の受け渡しも、関数の戻り値に指定した場合もDLLへ正常に受け渡しできないことも判明しました・・・。
結構色々問題がありそうですね。
SECRET: 0
PASS:
>本気のFX部長! Kirin@FTLさん
>やりたかったのは「参照渡し」なんですよ^^;
恐らくそうだと思うんですが、MQL4でいう配列のみ参照渡し出来ない仕様なんだと思います。
問題ではなく仕様なんだと思います…。
違ったら申し訳ないです。
ポインタ渡しってつまり値渡しですよね^^;
値渡しはそもそも代入不可なんではないでしょうか。
SECRET: 0
PASS:
>SeaStarさん
ポインタ渡しは値渡しではないです。
メモリのアドレスを渡すという形なので、参照先で値を変更させればメモリの中身が変わり、関数を抜けても値が変わった状態で出力されます・・・。
MQLのstring型からDLL側のchar型のみ、ポインタ渡しが可能みたいです。