オプション1)defファイルをどこに置くか考える。それがなければ、おそらくどこにも行けないでしょう。
オプション2)Visual Studioを インストールする
笑
オプション 3:
テスターがあり、少なくともVB excelから - 要求された関数が呼び出されることを確認します。
noの場合 - リンカの設定が悪い、yesの場合 - MQLの記述でエラーにならない。
MT4のインストールに伴い、優れたCソースDLLが提供されます - トレーニングにお使いください、多くの時間を節約できます。
#import "PExpDll.dll"
int GetIntValue(int)。
double GetDoubleValue(double)。
string GetStringValue(string)。
#インポート
MQL-4の関数宣言のルールによれば、明らかなエラーになります。
int GetIntValue(int X); double GetDoubleValue(double X); string GetStringValue(string X);
入力パラメータ名はなく、型のみです。MQL-4では禁止されています。
MQL-4の関数宣言のルールによると、明らかな間違いがある。
入力パラメータ名はなく、型のみです。MQL-4では、それは許されない。
コンパイラが誓わないことは、あなたが誓えばいいのです。
このように書いてみました。
#import "timeService.dll" // функция, выдающее смещение от Utc // до времени сервера и до локального времени int timeService( string , // <--- убрал имя переменной int & utcToServer[], int & utcToLocal[] ); #import
すべて正常に動作しています。
実は、CやC++の定石では、パラメータ名を指定する必要は全くない。
しかも、ほとんどの場合、プログラマーは座ってコメントするのが精一杯。
アドバイス、ご対応いただきありがとうございました。
1.MT4では、Service-Settings-Advisors-Confirmcall of dllfunctionsに チェックを入れています。そのため、スクリプトを実行すると、このような関数を呼び出すかどうか尋ねられるのですが......?はい」を選択すると、次のようなエラーが表示されます: cannot call function from dll (error 127).
2.double GetDoubleValue(double)のようにパラメータを持たない関数の宣言はどうでしょうか、サンプルではそう書かれていますし、特にコンパイラが文句を言わないので大丈夫でしょう。
3.しかし、def-fileはどうだろう...。確かに、def-fileのせいかもしれませんが、本当にどこに入れたらいいのかわからないんです。C++ Builder 6と2009のプロジェクトでは、そのような拡張子を持つファイルはありません。つまり、DLL自体をビルドしても、それを置く場所がないようです。同じフォルダで同じ名前のフォルダがないんだけど...。をやってみたが...要するに、はっきりしないのです。既製のシステムDLLを使用した別の例も試してみました。
#import "kernel32.dll"
int _lopen (string path, int of);
int _lcreat (string path, int attrib);
int _llseek (int handle, int offset, int origin);
int _lread (int handle, string buffer, int bytes);
int _lwrite (int handle, string buffer, int bytes);
int _lclose (int handle)。
#インポート
これらの機能は呼び出されます。DLLSampleの原因は不明です。
リンカーに原因があるとすれば、それは何でしょう?ファイルをスタンドアロンにしているようです。
ええと...そう...わからないわMT4での例は確実に動作しているのでしょうか?どなたか動作確認をされた方はいらっしゃいますか?
皆様、ご回答・ご対応ありがとうございました。
{...}3.デフファイルについては...もちろん、そのせいもあるのでしょうが、本当にどこに入れたらいいのか、はっきりしないのです。C++ Builder 6と2009のプロジェクトでは、この拡張子のファイルはありません。つまり、DLL自体をビルドするときに、それを貼り付ける場所がないようです。同じフォルダで同じ名前のフォルダがないんだけど...。をやってみたが...要するに、はっきりしないのです。既製のシステムDLL {...}を使用した別の例を試してみました。
これらの機能は、以下のように呼ばれています。DLLSampleの理由は不明です。
リンカーに原因があるとすれば、それは何でしょう?ファイルをスタンドアロンにしているようです。
M...うん...はっきりしないね。MT4の例では、確実に動作するのでしょうか?どなたか、動作確認をされた方はいらっしゃいますか?
皆様、ご回答・ご対応ありがとうございました。
1) ビルダーはエヘンなのに..."slightly" wrong, def file is still needed.
2) Visual Studioのインストールはもうお済みですか?
3) 作品例。ビルダーが違う。
1) ビルダーがエヘンであるにもかかわらず。"slightly" wrong, def file is still needed.
2)まだVisual Studioを試していない方
3) 作品例。ビルダーが違う。
実はmt4用のDLLはbilderで作ったのですが、def-fileは使い物になりませんでした...。
リンカーが原因だとすると、何があるのでしょうか?ファイルをスタンドアロン化するようです。
プロジェクト設定の「コンパイラ・リンカー」「パッケージ」タブのスクリーンショットを撮っていただけませんか?
以前はdibilderでmt4用のDLLを作っていましたが、def-fileは使い物になりませんでした...。
同僚と事例を共有する :-).
関数の宣言の前にスクイグルを書く必要があるかもしれませんね。
.
そして、ビルダー...サービスパックを4つ入れた6をまだ持っています。
おかしな事件があってから使うのをやめた:-)。
.cppファイルに関数を追加すると、いろいろな不具合が発生します :-)。
その不具合とは、ビルダーがスタックを介して関数に渡されるパラメータについて嘘をつくことであった。
その機能を削除すると、すべて元通りになります。
モジュールからしかアクセスできないグローバル変数も思い出せますね。
を宣言し、それ以外からはゴミを見ることになります :-)。
- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索
DLLから関数をインポートする方法を知りたいです。いろいろ試してみましたが、次のようなエラーが出続けます: cannot call function from dll (error 127).
1.C++ Builder 6でプロジェクトをコンパイルしてみました。
2. C++ Builder 2009で同じプロジェクトを作成。
3.C++ Builder 2009でDLLSampleの例からプロジェクトを作成し、コンパイルしてみました。
どこでも同じ結果です:DLLから関数を呼び出すことができません(エラー127)。
それをテストするために、私はPExpDll.dll - MetaTrader 4に付属しているDLLSampleの例からC++ Builder 2009でコンパイルされたライブラリ、とのスクリプトを使用します。
このスクリプトを紹介します。
#property copyright "著作権 © 2008, MetaQuotes Software Corp."
#プロパティリンク "https://www.metaquotes.net//"
#import "PExpDll.dll"
int GetIntValue(int)。
double GetDoubleValue(double)。
string GetStringValue(string)。
#インポート
//+------------------------------------------------------------------+
//| スクリプトプログラム起動機能
//+------------------------------------------------------------------+
int start()
{
//----
Print("スクリプト開始");
GetStringValue("I wonder if this will work?");
GetIntValue(10)です。
//----
return(0)です。
}
//+------------------------------------------------------------------+
どうか助けてください、何が間違っているのか教えてください...?
よろしくお願いします。