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

 

なんとなくhファイルに書いてみたけど


extern __declspec( dllexport) int __stdcall GetIntValue(int);

で、cppでは


int __stdcall GetIntValue(int)
 
おそらく、externというキーワードが 助けになるのでしょう。
 
alsu >> :

...


...そして、私は文字列を全く扱わないことを好みます....なぜDLLに必要なのか、それは美しさのため?

また、ボーランド自身は、必要であれば、メタトレーダー式にchar*またはchar[]を使うことを推奨しています。

 

ビルダーでの正しい宣言の仕方は以下の通りだと思います(正確には覚えていません)。

extern "C" __declspec(dllexport) int __stdcall GetIntValue();

 
GarF1eld >> :

ビルダーで次のように宣言するのが正しいと思います(正確には覚えていません)。

extern "C" __declspec(dllexport) int __stdcall GetIntValue();

そうそう

 

ありがとうございました。extern "C" int __declspec(dllexport) __stdcall GetIntValue() の後にこの例で動きました。

double関数とstring関数で試してみましたが、こちらもうまくいきました。私は、あなたから得た知識を実務に生かすことにしました。しかし、残念なことに...。残念ながら成功しませんでしたが。

もし可能なら、もう1度だけ助けてください。

Bilderプロジェクトには、DLL作成用のファイルとして、UHsvd.h、Usvd.cppなどが用意されています。

UHsvd.h ファイルには、後でエクスポートされるべき関数があります。

bool rmatrixsvd(ap::real_2d_array a,
int m,
int n,
int uneeded,
int vtneed,
int additionalmemory,
ap::real_1d_array& w,
ap::real_2d_array& u,
ap::real_2d_array& vt) です。

Usvd.cpp ファイルには、同じ関数が含まれているので、それをエクスポートする必要があります。

bool rmatrixsvd(ap::real_2d_array a,
int m,
int n,
int uneeded,
int vtneed,
int additionalmemory,
ap::real_1d_array& w,
ap::real_2d_array& u,
ap::real_2d_array& vt).

{

........

}

このバリアントでBilderのDLLのビルドを開始すると、すべてが「ビルド」され、すべてが動作し、エラーはありません。

UHsvd.h、Usvd.cppを以下のように変更すると

extern "C" bool __declspec(dllexport) __stdcall rmatrixsvd(ap::real_2d_array a.),

...............................................)と、2〜19のエラーが、それぞれ異なるバリエーションで表示されます。ヘッダーファイルの中にあるべきと理解していますが(そうすれば、2つのエラーしかありません)。

[BCC32 Error] Usvd.cpp(128): E2356 Type mismatch in redeclaration of '__stdcall rmatrixsvd(ap::real_2d_array,int,int,ap::real_1d_array &,ap::real_2d_array &)'
[BCC32 Error] UHsvd.BCC32: UHsvd.BCC32: UHsvd.h(111): E2344 '__stdcall rmatrixsvd(ap::real_2d_array,int,int,int,ap::real_1d_array &,ap::real_2d_array &)' の先の宣言について。

私の理解では、矛盾があるのですが......。でも、完全に理解できているわけではありません...。:-(

本当に皆様のご協力をお願いします。

 

boysn писал(а) >> {...}

もし可能なら、もう一回だけ助けてください。

Bilderプロジェクトには、DLLを作成するためのファイルとして、UHsvd.h、Usvd.cppなどが用意されています。

UHsvd.h ファイルには、次にエクスポートする必要がある関数があります。

bool rmatrixsvd(ap::real_2d_array a.),
int m,
int n,
int uneededです。
int vtneedです。
int additionalmemoryです。
ap::real_1d_array& w,
ap::real_2d_array& u,
ap::real_2d_array& vt); {...}.

私の理解が正しければ、ap::real_1d_arrayはクラスです。また、ap::real_1d_array & はクラスオブジェクトへの参照である。

しかし、やれやれ、Dllにパラメータとして渡せるのはダブルのmyData[]だけです。

は、関数の中では double * のように見えるでしょう。

 
jartmailru писал(а)>>

私の理解が正しければ、ap::real_1d_arrayはクラスです。また、ap::real_1d_array & はクラスオブジェクトへの参照である。

しかし、なんと、Dllにパラメータとして渡せるのは、doubleのmyData[]だけです。

で、関数では double * のように表示されます。

全く同感です。インポートするときにMQLでdoubleと宣言しておきます。しかし、現在、C++ Builder 2009でDLL自体を作成するのに苦労しています。構築時にエラーが発生するのですが。宣言を使用しない場合

extern "C" bool __declspec(dllexport) __stdcall rmatrixsvd(ap::real_2d_array a, ..., ...) であれば、問題なく、Bilderでライブラリのコンパイルに成功するはずです。さて、Bilderプロジェクトでエクスポート関数の宣言を正しく作成する方法がわかりません:-)

rmatrixsvd関数をエクスポートする機能を持つ、動作するDLLです。

 
boysn >> :

全く同感です。インポートする際にMQLでdoubleと宣言する予定です。しかし、今のところC++ Builder 2009でDLLそのものを作成することができず、困っています。構築時にエラーが発生するのですが。宣言を使用しない場合

extern "C" bool __declspec(dllexport) __stdcall rmatrixsvd(ap::real_2d_array a, ..., ...) であれば、問題なく、Bilderでライブラリのコンパイルに成功するはずです。さて、Bilderプロジェクトでエクスポート関数の宣言を正しく作成する方法がわかりません:-)

rmatrixsvd関数をエクスポートする機能を持つ、動作するDLLです。

ブルブル。妙に納得してしまったようですね。

.

実は、「アダプター」や「ブリッジ」を書こうという話なんです。

"アダプタ "という観点から、エクスポートされた関数のパラメータを

は、メタトレーダーが渡すことのできるパラメータと一致させる必要があります。

...つまり、呼び出したい場所に呼び出しを渡す追加の関数が必要なのです。

そして、機能上必要ないという観点からの「ブリッジ

と宣言することで、仕事そのものを行うことができます。

またその逆も然りで、作業を行う関数を呼び出す必要はありません。

.

つまり、インターフェースと実装を分離する必要がある、つまり、実装は、クラス

.そして、誰にも知られることのないDllの外部にある関数。

.

しかし、一例を考えてみよう。

.

このように関数を宣言します。

extern "C" bool __declspec(dllexport) __stdcall RMatrixSVD_DLL_ADAPTER(double * in1, double * in2, double * out)

// もちろん、ここで行と列の数も渡します。

{

//入力パラメータを ap::real_2d_array に変換する

ap::real_2d_array a1 = convertPDoubleToReal2DArray(in1);

ap::real_2d_array a2 = ;

.

//calculate

ap::real_2d_array a3;

rmatrixsvd(a1, a2, a3);

.

//a3の結果をoutに変換する

convertReal2DArrayToPDouble(a3, out);

.

を返します。
}

.

ここでは - もちろん - 関数 rmatrixsvd を使用します。

は extern "C" や __stdcall, __declspec などとして宣言されていません。

なぜなら、内部の隠れた実装の一部だからです。

 

すみません、残念ながらよく分かりませんでした...。

http://alglib.sources.ru/ から、私が必要とするC++の実装(コード)をダウンロードしました。よろしければ、添付の100KBのアーカイブをご覧ください。このアルゴリズムには多くの補助関数があり、総コード行数は3000行といったところでしょうか...。だろう

ホームページにそう書いてある、つまりやりすぎで、MQLに換算するとかなり難しい...。アルゴリズムそのものを理解していないと、正しく翻訳することはできません。今のところ、私にとってはちょっと複雑なんです。そこで、C++ Builder 2009を使って、この出来合いのコードでDLLを作り、そのDLLから必要なrmatrixsvd(...)関数を呼び出したいと思っています。そこで困ってしまって......。どこで、どのように宣言するのが正しいのか...。このコードで、そこの一行を変更しなくても、エラーなく、DLLはビルドされます。しかし、extern "C" bool __declspec(dllexport) __stdcallを入れるとすぐにエラーになる...。

お忙しい中、ありがとうございました。

ファイル:
svdy1e.cpp.zip  94 kb