2012-04-02 13 views
1

私はVC++ 2008でDLLを作っていると私はコンソールアプリケーションVC++ 6.0で使用する場合、例外がある:VC++ 2008でDLLを作成し、VC++ 6で使用できますか?

(msvcr90.dll):0xc0000005で:アクセス違反

+0

VS2008とVS2006のようなC++プログラムの作成方法にも違いがあるので、私は考えることはできませんでした.2006年には.h拡張子のヘッダーファイルがありますが、しかし、主な質問は、あなたが2008年から2006年に行く理由は何ですか? –

+1

多分、そうではないかもしれません。インターフェイスを設計するときに本当に、本当に慎重であれば、確かに可能です。しかし、一般的なケースで - いいえ、それは動作しません。 –

+0

DLLはアンマネージコードです。 –

答えて

5

Access Violationこの場合は非常に多くのことを意味する可能性があり、msvcr90.dllの参照は非常に誤解を招く可能性があります。 MSVC標準ライブラリ関数のいずれかに無効なデータを渡すと、コード内でなく、msvcr90.dllの範囲内でアクセス違反が発生します(スタックトレースを表示したり例外情報を参照する場合)

しかし、理論上、ABIが変更されず、PEフォーマットが同じであるため、VC++ 6のVC9 DLLを使用すると問題になる可能性があります。msvcrt9.dllがサポートされていないと問題が発生する可能性があります(WindowsのMSVC6 。NT)、それ以外それはあなたのコードを確認する必要があることを意味

私が何を意味するかは、次のとおりです!デバッガをアタッチし、シーンの下に何が起こっているかを見てみ

もう1つ注意してください:異なるバージョンのMSVCライブラリを動的に使用する場合、同じヒープを使用することが保証されておらず、メモリ破損を招く可能性があるため、あるライブラリでデータを割り当てて別のライブラリに解放してはいけません(そしてAccess Violationエラー)これはかなり簡単です。これはまた、C++を書く場合、オブジェクトを作成して、呼び出し元のアプリケーションに戻り値で渡してはいけません。これはシーンの下で起こることです。

+0

ありがとう、Mahmoud、あなたのメモは本当に私を助けました。私はstd :: stringとしてDll関数にテキストを送受信していましたが、私がchar *として送受信したときに問題は解決しました。 –

+0

これはほとんどの場合、最大の原因です。私は助けになることができてうれしいです。 –

+0

こんにちはMahmoud、もう助けが必要です。私のDLLにテキストを送り、char *として受け取っています。返されるテキストが13文字未満または77文字を超える場合、何か不思議なことが起こります。 –

3

は、Visual C++バージョンXでDLLをビルドして、Visual C++バージョンYでそれを使用したい場合、あなたには、いくつかのオプションがあります。

  1. 純粋なCインタフェースを公開するDLLをビルドします。 DLLのの中で使用できますが、パブリックインターフェイスは純粋なCでなければなりません(たとえば、DLLの境界を越える例外をスローすることはできません)。
  2. COM DLLをビルドします(おそらくATLのようなツールの助けを借りて)。
  3. (この技術は、段落"C++ Mature Approach: Using an Abstract Interface"で特に、CodeProjectの"HowTo: Export C++ classes from a DLL"に、この資料で説明されている)、すなわちのみ抽象インターフェースして、DLLからファクトリ機能を公開する、COM状技術を使用して、DLLを構築します。

the code which allocates memory and the code which frees memory must use the same allocatorを指摘することも重要です。

関連する問題