2011-12-23 8 views
0

VC++でDLLとリンクするメインプログラムがあります。ヘッダーファイルの外側にあるクラスメソッドを宣言すると、DLLはすべてコンパイルされてリンクされますが、Mainはそれらにアクセスできません。ソースファイル(VC++)で定義したときにDLLメソッドがエクスポートされない

//mydll.h 
#if XXX_EXPORTS 
#define CLASS_DECLSPEC __declspec(dllexport) 
#else 
#define CLASS_DECLSPEC __declspec(dllimport) 
#endif 


class CLASS_DECLSPEC COrbitPropagator 
{ 
public: 
    int test(double initime, std::vector<double> inivector); 
} 

Iは、ヘッダファイル(インラインまたはこの宣言以下)主要作品で試験方法を定義する場合。私は.CPPソースファイルで、このメソッドを定義した場合ただし、このメソッドを呼び出すときに、メインは失敗し、それがこのメッセージを出力します。

HEAP [MAIN.EXE]:RtlFreeHeapに指定された無効なアドレス(003A0000、 003C2CE8)

ランタイム(dllとmain)はどちらもDebug Multi-threaded DLLに設定されていますが、他の組み合わせを試してみました。解決策はありますか?私はすべての私のDLLコードをヘッダファイルに書くのを避けたいと思います!

EDITED: This only happens when the method uses the stl (e.g. std::vector, std::string) 
+0

まず、 'std :: vector &'という参照で 'inivector'を渡す必要があるかもしれません。しかし、エクスポートされた関数でテンプレートクラスを渡すことは悪い考えです。私はそれをしないだろう。 –

+0

テンプレート化されたクラスをモジュールの境界を越えて渡すのは、単に問題を尋ねるだけです。私はそれが働いていたらもっと驚くだろう。 – tenfour

答えて

3

あなたは、ヘッダーでコードを書くときに、呼び出しがインライン化されているので、それは動作しますので、それはそれを検索するためにDLLに行くことはありません。

重要なユーティリティ:Dependency Walkerを使用して、テスト機能がインポート/エクスポートされているかどうかを確認できます。

とにかく、コピーによってstd::vectorをDLLに渡しています。したがって、DLLとEXEは、と全く同じC++ヘッダー、ライブラリ、コンパイラのバージョンとコンパイラのオプションを使用して、正確にでコンパイルされ、リンクされている必要があります。

このルールに従わない場合は、例えば、DLLがデバッグで、EXEがリリースされ、その後、あなたは非常に奇妙な効果を得られます:あなたはDLLを混在させる必要がある場合など、ランダムな破損、クラッシュ、

をEXEが異なる方法でコンパイルされた場合、インターフェイスは厳しく制限されなければなりません(クロスダイナミックメモリのないプレーンC)。

+0

ありがとうRodrigo et al。あなたの貴重な答えのために。参照によってベクトルを渡すことは間違いなく機能しました!コンパイラのオプションは、VC++がそれを課しているため、まったく同じではありませんでした(DLLは__stdcallを持ち、mainは__cdecl呼び出し規約を持つなど)。 –

関連する問題