C++アプリケーションからC++Win32 DLLに構造体を渡す方法は?
例を挙げていただけませんか。
WindowsのDLLはプログラムと同じアドレス空間にあるため、ポインタを渡すことができます。
ただし、DLLインターフェイスはそこで停止し、(通常は)共有メモリ管理がなく、一般に、たとえばanを渡して、DLLが新しい要素を処理std::vector
できることを期待できないことに注意してください。push_back
その理由は、DLLには一般に、呼び出し元の1つから分離された独自のメモリマネージャーとヒープがあるためです(結局、DLLは、必ずしもC ++ではなく、任意の言語から呼び出すことができます)。
標準ライブラリの一部のコンテナは「センチネル」に依存しており、これらはDLLでも複製される可能性があるため、DLLを渡しstd::map
てDLLを取得し、それを読み取るだけでは機能しない場合があります。
上記では、DLLにメモリ管理をメインプロセスと共有できるようにするためのトリックがある可能性があるため、「一般的に」という用語を使用しました。たとえば、Microsoft MFCは、VC6以降のこれらのDLLバリアを適切に回避するように設計されています(ただし、標準ライブラリではありません)。
また、DLLとメインプログラムがまったく同じコンパイラとコンパイルオプションでコンパイルされていることを確認する必要があります。そうしないと、プレーンな構造でもメモリレイアウトが異なる可能性があります。
あなたはどのようにstruct
定義されていますか?それはPODですか?シンプルなCstruct
ですか?それともstruct
、STLクラスのインスタンスであるメンバーを持っているのですか?
struct
が「純粋なC」の場合struct
は、DLLに渡すだけです。
ただし、struct
がデータメンバーとしてSTLクラスを持っている場合は、.EXEと.DLLの両方がCRTへのダイナミックリンクを使用し、同じバージョンのVisual C++コンパイラと同じフレーバーのCRTで構築されていることを確認する必要があります(例: STLコンテナの実装がデバッグビルドからリリースビルドに変わるため、debug-build.EXEとrelease-build.DLLがある場合、境界でSTLクラスを渡すことはできません。また、でSTLクラスを渡すことはできません。たとえばVC10でビルドされた.EXEとVC9でビルドされた.DLLがある場合は境界。
さらに、CodeProjectに関するこの興味深い記事 「ハウツー:DLLからC++クラスをエクスポートする」を読むことをお勧めします。