CString in einer Konsolenanwendung
-
Hi, ich wollt den MFC-CString in einer Konsolenanwendung hernehmen nur wirft er beim linken dann folgende Fehler:#
Linker-Vorgang läuft...
nafxcwd.lib(thrdcore.obj) : error LNK2001: Nichtaufgeloestes externes Symbol __endthreadex
nafxcwd.lib(thrdcore.obj) : error LNK2001: Nichtaufgeloestes externes Symbol __beginthreadex
Debug/dlgparser.exe : fatal error LNK1120: 2 unaufgeloeste externe Verweise
Fehler beim Ausführen von link.exe.dlgparser.exe - 3 Fehler, 0 Warnung(en)
ok es ist bestimmt irgendeine Linkeroption ...... nur welche!
-
haste in den projektoptionen, MFC Bibilothek statisch/dynamisch benutzen, verwendet?
-
Hi!
Probier mal #include <afx.h>mfg
-
warum nimmst du nicht std::string ?
Devil
-
CString (MFC) und z.B. auch wxString (wxWindows) stammen aus Zeiten, in denen nicht jeder Compiler std::string unterstützte. Inzwischen ist dies aber obsolet. Daher sollte man auf std::string umstellen.
-
std::string ist auch nicht so dass wahre,
ich nutze auch viel lieber eine erweiterung von cstring (ohne MFC),
irgendwie komme ich damit besser zuerecht.
-
@Dezipaitor: Kannst Du das genauer erläutern? Wo ist das Problem bei std::string, und was ist "cstring" genau?
-
naja ich will keinen von std::string abbringen,
letztendlich kann jeder das verwenden, was ihm besser liegt.ich verwende lieber
entweder eine kopie der klasse cstring für nonmfc
http://www.sourceforge.net/projects/vtools
oder
eine überladung von operatoren (+,+=...).um
z.b. dies zu ermöglichen string1 + string2
uswaber ich werde wohl mal nach einer erweiterung von basic_string suchen,
um auch zahlenkonvertierungen über streams durchführen zu lassen (wie in vstring)
man muss noch zuoft API funktionen verwenden und mit c_str konvertieren um zu suchen, ersetzen , zu konvertieren usw.class VString :VThreadSafeClass { public: bool CmpCaseSensitive; VString(); VString(const char String,bool nCmpCaseSensitive = FALSE) ; VString(const VString &String,bool nCmpCaseSensitive = FALSE) ; VString(const STRING String,bool nCmpCaseSensitive = FALSE); VString(const STRING String, int LenOrPort, bool IsIP =FALSE,bool nCmpCaseSensitive = FALSE); VString(const STRING IPAddress,const STRING Port); virtual ~VString(); void Init(); //Empties and initiates a new string with a length of <size>. result is the new allocated size int PreAlloc(int Size); bool IsValidIndex(int nIndex) const; void MakeReverse( ); VString MakeReverseV(); void MakeLower(); VString MakeLowerV(); void MakeUpper(); /*Erzeugt aus dem String der Klasse eine Kopie und gibt das Ergebnis von MakeUpper zurück. Die Daten des String werden dabei nicht verändert.*/ VString MakeUpperV(); int Replace(const STRING lpszOld,const STRING lpszNew ); int Remove(const CHAR ch ); /*Fügt einen String an der Stelle nIndex ein. Soll ein String vor dem ersten Zeichen eingefügt werden, muss nIndex 0 sein*/ int Insert( int nIndex, const STRING pstr, int Length = 0 ); int Append(const STRING pstr, int Length = 0 ); int Delete( int nIndex, int nCount = 1 ); void Format(const STRING lpszFormat, ... ); void FormatV(const STRING lpszFormat, va_list argList ); /*Zeichen links und rechts löschen Ist ch nicht angegeben, wird nach \t \n \r ' ' gesucht */ void TrimLeft(CHAR ch = NULL); void TrimRight(CHAR ch = NULL); void TrimWhiteSpaces(); void TrimCReturns(); /*not implemented*/ void FormatMessage(const STRING lpszFormat, ... ); /*sucht nach einem SubString pstr (Unterscheidung v. Groß-Kleinschreibung mit CmpCaseSensitive) ab nStart und gibt das erste Zeichen des gefundenen Substrings zurück. nStart und der Rückgabewert basiert auf dem ersten Zeichen, das den Index 1 besitzt. Wenn nichts gefunden wird, wird 0 zurückgegeben, Bei Fehlerfall -1 */ int Find(const STRING pstr, int nStart = 1) const; int Find(const char pstr, int nStart = 1) const int ReverseFind(const CHAR ch ) const; // VString Mid( int nFirst, int nCount ) const; VString Left( int nCount ) const; VString Right( int nCount ) const; bool IsEmpty() const; void Empty(); //Zeichenoperationen bool SetAt(int nIndex, CHAR ch) ; CHAR GetAt(int Index) const; //Vergleichsmethoden int Compare(const STRING lpsz ) const; int CompareCase(const STRING lpsz) const; int CompareNoCase(const STRING lpsz ) const; VString SpanExcluding(const STRING lpszCharSet) const; VString SpanIncluding(const STRING lpszCharSet) const; int FindOneOf(STRING lpszCharSet ) ; int GetLength( ) const; //String als (ganzzahlige) Nummer - Methoden long Str2IntDefL(int Def); int Str2IntDef(int Def); long Str2IntL() ; int Str2Int(); VString Int2Str(long Value); VString Int2Str(int Value); bool IsNumberInt(); //String als IP-Addresse mit Port int GetPort(); bool IsValidIP(); VString GetIP(); /*VString p("4E5"); ULONG d = (ULONG)(p.StringToType <double> ());*/ template <class T> T StringToType (); //Routinen zum direkten Puffereingriff int GetBuffer(STRING &Buffer); //inline STRING GetBuffer(size_t Length = -1) STRING GetBuffer(); int SetBuffer(const STRING p, int len); //Zugriff auf einzelne Zeichen CHAR operator [](int nIndex) const; int FillChar(VCHAR FillChar, size_t Length = 0); //additional functions out of basic_string inline STRING c_str(); operator STRING() const; size_t capacity( ) const; inline void swap(VString &_Str); inline void swap(STRING &_Str,size_t Length = 0); inline void swap(char &_Str); //Veränderungsoperatoren VString operator +( const VString& string); VString operator +( const CHAR ch); const VString& operator +=( const VString& string ); const VString& operator +=( const CHAR ch ); VString& operator =( const VString& String ); //VString& operator =(void *String) { (*this) }; /*Vergleichsoperatoren. Unterscheidung zwischen Groß- und Kleinschreibung durch Setzen von CmpCaseSensitive. */ BOOL operator ==( const STRING s); BOOL operator !=(const STRING s); BOOL operator <(const STRING s); BOOL operator >(const STRING s); BOOL operator <=(const STRING s); BOOL operator >=(const STRING s); }; //Hilfsfunktionen extern _EXPORT_DLL_ long _Str2IntDefL(const STRING,int Def); extern _EXPORT_DLL_ int _Str2IntDef(const STRING,int Def); extern _EXPORT_DLL_ STRING _Int2Str(long Value); extern _EXPORT_DLL_ STRING _Int2Str(int Value); extern _EXPORT_DLL_ int _MakeUpper(STRING &text); extern _EXPORT_DLL_ int _MakeUpper(char &ch); extern _EXPORT_DLL_ int _MakeLower(STRING &text); extern _EXPORT_DLL_ int _MakeLower(char &ch); extern _EXPORT_DLL_ int _CmpText(const STRING str1,const STRING str2); extern _EXPORT_DLL_ STRING _FormatStr(const STRING lpFormatString,...); extern _EXPORT_DLL_ long Str2IntDefL(const VString Num,int Def); extern _EXPORT_DLL_ int Str2IntDef(const VString Num,int Def); extern _EXPORT_DLL_ VString Int2Str(long Value); extern _EXPORT_DLL_ VString Int2Str(int Value); static vtools::VString operator +(const VString s1, const VString s2) static vtools::VString operator +(const char s1, const VString s2)
-
Du hast wahrscheinlich die "Single Threaded" - C++ Laufzeit - Bibliotheken angegeben, MFC besteht aber auf Multithreaded.
Die WTL enthält einen (nunmehr ofiziellen) CString-Klon für die ATL, bei dem meines Wissens nur die .Load-methode angepaßt werden muß.
ph
-
Also ich muss gestehen, dass ich sowohl std::string als auch CString verwende. std::string benutze ich wenn es plattformabhängig sein soll. Wenn fest steht, dass die Applikation sowieso nur auf Windows laufen soll nehme ich öfters den einfacheren und umfangreicheren CString. Mir fehlen bei std::string einfach die üblichen Funktionen wie Replace und Trim. Ich habe früher mal eine Klasse stringex geschrieben die alle diese Funktionen für std::string hatte (finde sie aber nicht mehr).