2017-07-30 21 views
1

私はVS 2010 C++ソリューションを2つのプロジェクトに持ちます.1つはDLLを生成し、もう1つはDLL関数のドライバです。次のコードはすべてstd :: stringはDLLで値を割り当てることができません

char cstring [256]; 
strcpy (cstring, "C String"); 
std::string string1 = "Test String"; 
std::string string2 (string1); 
std::string string3; 
string3.assign (cstring); 

がドライバでうまくいきます。しかし、同じコードがDLLプロジェクトのどこにでも置かれていれば、string1、string2、およびstring3のいずれも、どの値でもうまく割り当てられません。ほとんどの場合、デバッガはBad Ptrと表示します。彼らはメモリにうまく割り当てられていないように見えます。

クラスメンバーフィールド、自動変数、および静的変数としてstd :: stringを配置しようとしました。しかし、いずれの方法も期待どおりに機能しません。誰かが原因を見つけるのを助けることができますか?

+0

標準的なDLLの問題は、DLLとEXEがまったく同じ標準C++ライブラリを使用しない場合に発生します。デバッグでビルドされたEXEほどシンプルなので、msvcp100d.dllとReleaseでビルドされたDLLを使用してmsvcp100.dllを使用します。/MDの代わりに/ MTを使用してビルドするのはもう一つの伝統的な間違いです。どちらのプロジェクトも* exact *同じコンパイラバージョンとビルド設定を使用して、ライブラリの1つのコピーのみが使用されている必要があります。デバッグ> Windows>モジュールを使用して診断します。 –

+0

本当である可能性があります。しかし、他のライブラリを構築するためにどのようなオプションが使用されたかを知ることは難しいです。今日私は、ドライバとDLLがVS 2010環境外のインストールで問題なく成功して実行できることを知りました。だから、ランタイムの問題を抱えています。 – Lucius

+0

もしあなたがそれを知らないのであれば、不一致率が99.9%に上昇するでしょう。DLLインターフェースからstdタイプを公開するプログラマーは、電話を持っている必要があります。 –

答えて

0

この理由は、アプリケーションバイナリインターフェイス規格(ABI)の欠如だと思います。この問題はこの投稿に完全に記載されています。 How do I pass objects especially stl objects to and from a dll

ライブラリープロジェクトとプロジェクトの使用を確実にするために必要な 'プロパティー>> c/C++ >>コード生成>>ランタイムライブラリー設定(/ MTおよび/ MD設定)でもかまいません。

+0

はい、DLLの外部から渡された文字列が破損していることは事実です。しかし、より大きな問題は、ローカルで定義された文字列を初期化することさえできないことです。彼らはほとんどすべてBad Ptrです。 – Lucius

+0

ランタイムライブラリ設定が両方のプロジェクト(dllとimplementor)で同じであることを確認しましたか? – Treebeard

関連する問題