- 締切済み
DLLの作り方
DLLでは、ポインタのアドレス渡しのように、可変長サイズのVectorコンテナを引数にすることは可能ですか? DLLのソースコ-ド extern "C" __declspec(dllexport) void __stdcall matinv(vector<vector<complex<double> > >,vector<vector<complex<double> > >&); void __stdcall matinv(vector<vector<complex<double> > > a,vector<vector<complex<double> > > &a_inv) { コード } 呼び出し側の関数宣言 #include <vector> #include <math.h> #pragma hdrstop #include <complex.h> using namespace std; extern "C" __declspec(dllimport) void __stdcall matinv(vector<vector<complex<double> > > a,vector<vector<complex<double> > > &a_inv); よろしく御願いいたします。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- K-Nagisa
- ベストアンサー率0% (0/0)
#1 の者です。補足に対して。 バリアント型は Windows の COM/OLE で扱われるデータ型です。 配列も含めていろいろなデータ型を収容できます。 Visual Basic からはバリアント型を容易に扱うことができますが、 C/C++ から扱うには、COM/OLE の十分な知識が必要となりますし、あまり使われません。 回答になっていないかもしれません、すみません。
- K-Nagisa
- ベストアンサー率0% (0/0)
こんにちは。 MinGW GCC で試してみましたが、基本的なところでは問題ないようです。 試した事項は、 * 呼び出し側にて、適当な値を入れた行列を第 1 引数に与え、DLL 側で内容を表示。 * DLL にて、第 2 引数に適当な値を入れ、呼び出し側で内容を表示。 ただし、問題がないわけではありません。 今回は、MinGW GCC にて DLL を生成し、同じ開発環境にて呼び出しました。 ところが、MinGW GCC で作成した DLL を Visual C++ で利用しようとすると、 リンクエラーが発生しました。 C (C++ ではなく) の範囲では、基本的なデータ型 (int、double...) に対して、 開発環境をクロスしても問題が発生する可能性は低いです。 しかし、STL など C++ の範囲では、開発環境によって、関数をエクスポートする 方法が異なることがあるため、DLL の相性が合わなくなるということです。
補足
可変長サイズの配列を引数にするには、Valiant 配列を使うと書かれていました。可変長サイズのコンテナでも、引数に出来るのでしょうか?
補足
バリアント型は、元はPascal系の境界情報付き配列で、COM/OLEにも採用されたと聞きます。ところが、アクセスがかなり遅くなる欠点があります。それで、同じく、可変長サイズの配列を可能とするVectorコンテナを使った方法を探しているところです。