3

std::stringアンマネージ C++ dll には、引数として定数を取る関数があります

 Prototype : void read ( const std::string &imageSpec_ )

この関数をマネージ C++ DLL から呼び出すには、std::string.
アンマネージ C++ コードをデバッグすると、パラメーターimageSpec_は値を正しく表示しますが、その値を他の変数にコピーすることはできません。

 imageSpec_.copy( sFilename, 4052 );

の長さをimageSpec_ 0(ゼロ)として表示します。
このステートメント文字列のようにコピーしようとするstd::string sTempFileName(imageSpec_);と、新しい文字列は空の文字列になります。

しかし、std::string sTempFileName(imageSpec_.c_str());このステートメントでは文字列が正しくコピーされます。つまり、charpointer 文字列は正しくコピーされます。

この方法でコピーするには、アンマネージ C++ コードを大幅に変更する必要があります。
Visual Studio 6.0 でアンマネージド コードをビルドし、Visual Studio 2008 でマネージド C++ をビルドして
います。この問題を解決するマネージド C++ の特定の設定またはコードの変更はありますか?

4

1 に答える 1

1

Visual Studio 6.0 でアンマネージ コードをビルドし、Visual Studio 2008 でマネージ C++ をビルドしています。

std::stringVisual Studio 6.0 の実装を Visual Studio 2008 の実装にコピーしようとしていstd::stringます。DLL の境界を越えて C++ オブジェクトを渡したい場合は、非常に注意する必要があります。まったく同じオブジェクトを使用して境界の両側を構築する必要があります。レイアウト (コンパイラ固有) とライブラリの実装を組み合わせて、互換性のあるランタイムに対してビルドします。

その .dll とは異なるコンパイラ/ライブラリでコンパイルされたコードから使用可能な .dll を作成する場合は、純粋な C インターフェイスを使用することをお勧めします。


この関連する質問を参照してください。

于 2010-03-12T15:17:58.430 に答える