2

何年も前に、DLL で std::string から継承し、"MakeUpper" のような関数を文字列に追加するというミスを犯しました。VS2008 から VS2012 に変換すると、npos がポップアップする問題が発生します。Microsoft * の回避策により、他のいくつかの DLL が動作しますが、遅延バインディングが使用され、DLLMain() 関数を持たない DLL は動作しません。

* Microsoft の回避策

#if _MSC_VER >= 1600
#include <string>
const std::basic_string<char>::size_type std::basic_string<char>::npos =   (std::basic_string<char>::size_type) -1;
#endif

クラスは、次のように DLL で宣言されます。

class  MYDLL_API CNyString  : public std::string

エラーラインはこれです:

error LNK2001: unresolved external symbol "public: static unsigned int const std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::npos" (?npos@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@2IB)

属性として std::string を使用して MyString クラスを書き換えても機能しません。これは、MyString 関数と文字列関数が多く混在している他のいくつかの DLL で使用されているためです。また、関数パラメーターでも使用されています。例:

 void Foo(const CMyString &Param_) ..
 ...
 Foo(std::string("Hallo World")..

この問題を解決する方法を知っている人はいますか? 前もって感謝します。

4

0 に答える 0