アプリケーションと DLL 間のデータ交換は、特に C クラス オブジェクトを扱う場合に困難になる場合がありますSTLコンテナ。これらの交換では、さまざまなコンパイラ間で ABI (アプリケーション バイナリ インターフェイス) への準拠が保証されていないため、安定性に関する懸念が生じる可能性があります。
主な推奨事項は、オブジェクトの直接受け渡しを避けることです。 DLL とアプリケーションの間。この方法では、データの配置、クラス メンバーの並べ替え、呼び出し規則、データ型のサイズ、およびヒープ管理のコンパイラー固有の解釈が原因で、互換性の問題が発生します。さらに、C 標準ライブラリ (STL) には独自の ABI の問題があり、オブジェクトの直接交換に依存することはさらに危険です。
、データ交換プロセスを抽象化する、明確に定義されたインターフェイス層を作成することをお勧めします。このインターフェイスは、明示的に宣言された関数シグネチャを持つ C スタイルの関数を使用して、両側で実装する必要があります。 C の明確に定義された ABI を活用することで、オブジェクトの受け渡しに関連する潜在的な問題を回避できます。
どうしても C オブジェクトを交換する必要がある場合は、次の手順を実行できます。リスクを最小限に抑える:
1.データ パッキング: #pragma Pack ディレクティブを使用して、コンパイラ間で一貫したデータ パッキング スキームを強制します。これにより、クラス データ メンバーのメモリ アライメントの一貫性が確保されます。
2.標準レイアウト クラス: 互換性を確保するには、標準レイアウト クラスを (メンバーの並べ替えなしで) 使用します。
3.一貫した呼び出し規約: 呼び出し規約を明示的に指定し (__cdecl など)、DLL とアプリケーション全体で一貫性を確保します。
4.固定サイズのデータ型: コンパイラ間のデータ型サイズの違いから生じる潜在的な問題を回避するために、可能な限り固定サイズのデータ型を使用します。
5.マネージド ヒープ メモリ: Windows ヒープ管理 API を利用して、メモリの割り当てと割り当て解除が両側で一貫して処理されるようにします。
6. STL の問題を解く: STL コンテナを境界を越えて渡す前に、STL コンテナを構成要素の基本タイプに分解し、受信側で再構築します。
7.名前マングリングの回避策: カスタム .def ファイルを使用して、名前マングリングをバイパスし、ダイナミック リンク用にマングリングされていない関数シグネチャを公開します。
注意: これらの対策は複雑であり、エラーであることに注意してください。傾向があり、潜在的な互換性の問題が依然として発生する可能性があります。徹底的なテストと注意が不可欠です。
以上がC DLL とアプリケーション間でデータを安全に交換するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。