DLLから関数をインポートする際の問題解決を支援します。

 

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)です。
}
//+------------------------------------------------------------------+

どうか助けてください、何が間違っているのか教えてください...?

よろしくお願いします。

 

オプション1)defファイルをどこに置くか考える。それがなければ、おそらくどこにも行けないでしょう。

オプション2)Visual Studioを インストールする

 

オプション 3:

テスターがあり、少なくともVB excelから - 要求された関数が呼び出されることを確認します。

noの場合 - リンカの設定が悪い、yesの場合 - MQLの記述でエラーにならない。

MT4のインストールに伴い、優れたCソースDLLが提供されます - トレーニングにお使いください、多くの時間を節約できます。

 
boysn >> :

#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では禁止されています。

 
Urain >> :

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での例は確実に動作しているのでしょうか?どなたか動作確認をされた方はいらっしゃいますか?

皆様、ご回答・ご対応ありがとうございました。

 
文字列のパラメータを渡して、同じ型の結果を与えるにはどうしたらいいのでしょうか? Bilderは文字列を扱うのに独特な性質があります。
 
boysn >> :

{...}3.デフファイルについては...もちろん、そのせいもあるのでしょうが、本当にどこに入れたらいいのか、はっきりしないのです。C++ Builder 6と2009のプロジェクトでは、この拡張子のファイルはありません。つまり、DLL自体をビルドするときに、それを貼り付ける場所がないようです。同じフォルダで同じ名前のフォルダがないんだけど...。をやってみたが...要するに、はっきりしないのです。既製のシステムDLL {...}を使用した別の例を試してみました。

これらの機能は、以下のように呼ばれています。DLLSampleの理由は不明です。
リンカーに原因があるとすれば、それは何でしょう?ファイルをスタンドアロンにしているようです。

M...うん...はっきりしないね。MT4の例では、確実に動作するのでしょうか?どなたか、動作確認をされた方はいらっしゃいますか?

皆様、ご回答・ご対応ありがとうございました。

1) ビルダーはエヘンなのに..."slightly" wrong, def file is still needed.

2) Visual Studioのインストールはもうお済みですか?

3) 作品例。ビルダーが違う。

 
jartmailru >> :

1) ビルダーがエヘンであるにもかかわらず。"slightly" wrong, def file is still needed.

2)まだVisual Studioを試していない方

3) 作品例。ビルダーが違う。

実はmt4用のDLLはbilderで作ったのですが、def-fileは使い物になりませんでした...。

 
boysn >> :

リンカーが原因だとすると、何があるのでしょうか?ファイルをスタンドアロン化するようです。


プロジェクト設定の「コンパイラ・リンカー」「パッケージ」タブのスクリーンショットを撮っていただけませんか?

 
alsu >> :

以前はdibilderでmt4用のDLLを作っていましたが、def-fileは使い物になりませんでした...。

同僚と事例を共有する :-).

関数の宣言の前にスクイグルを書く必要があるかもしれませんね。

.

そして、ビルダー...サービスパックを4つ入れた6をまだ持っています。

おかしな事件があってから使うのをやめた:-)。

.cppファイルに関数を追加すると、いろいろな不具合が発生します :-)。

その不具合とは、ビルダーがスタックを介して関数に渡されるパラメータについて嘘をつくことであった。

その機能を削除すると、すべて元通りになります。

モジュールからしかアクセスできないグローバル変数も思い出せますね。

を宣言し、それ以外からはゴミを見ることになります :-)。