VS streikt
-
path und filter sind ja auch std::strings...
-
void dirsearch(const string& path, const string& filter) { HANDLE hFindFile; WIN32_FIND_DATA wfd; string buf; buf = path + "\\" + filter; //So? hFindFile = FindFirstFile(buf.c_str(), &wfd); if (hFindFile != INVALID_HANDLE_VALUE) { do { if ((wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == 0) cout << path <<"\\"<< wfd.cFileName << endl; }while(FindNextFile(hFindFile, &wfd) != 0); FindClose(hFindFile); } }
-
Hier der Code:
void dirsearch(const string& path, const string& filter) { HANDLE hFindFile; WIN32_FIND_DATA wfd; TCHAR buf[1000]; SecureZeroMemory(buf, 1000); _stprintf_s(buf, _T("%s\\%s"), path, filter); //hier bleibt der Debugger hängenAn der oben gezeigten Stelle springt er in die output.c und hängt dann im folgenden Block:
else /* _UNICODE */ if (flags & (FL_LONG|FL_WIDECHAR)) { if (text.wz == NULL) /* NULL passed, use special string */ text.wz = __wnullstring; bufferiswide = 1; pwch = text.wz; while ( i-- && *pwch ) ++pwch; textlen = (int)(pwch - text.wz); /* textlen now contains length in wide chars */ } else { if (text.sz == NULL) /* NULL passed, use special string */ text.sz = __nullstring; p = text.sz; hier --> while (i-- && *p) ++p; textlen = (int)(p - text.sz); /* length of the string */ }Fehlermeldung:
Unhandled exception at 0x102293fe (msvcr80d.dll) in test.exe: 0xC0000005: Access violation reading location 0xcccccccc.
-
mach mal des
statt
_stprintf_s(buf, _T("%s\%s"), path, filter);dieses
_stprintf_s(buf, _T("%s\%s"), path.c_str(), filter.c_str());ich glaub das es mit den strings selber nicht geht
aber ich frag nochmal, warum so?
das ist besser
std::tstring strTemp; strTemp = path + _T("\\") + filter; TCHAR *strBuff = new TCHAR[(strTemp.length())+(sizeof(TCHAR))]; _tcscpy_s(strBuff, temp);
-
Danke für die Mühen und deine Geduld Evil. Es läuft jetzt!

Eine Sache noch kannst du mir den Vorteil von deinem Code gegenüber dem hier erklären?
Ich verlier nämlich langsam den Überblick und versuchs jetzt so leicht wie möglich zu schreiben.void dirsearch(const string& path, const string& filter) { HANDLE hFindFile; WIN32_FIND_DATA wfd; string buf; buf = path + "\\" + filter; cout << "Es wird gesucht nach: " << buf << endl; hFindFile = FindFirstFile(buf.c_str(), &wfd); if (hFindFile != INVALID_HANDLE_VALUE) { do { if ((wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == 0) cout << path <<"\\"<< wfd.cFileName << endl; }while(FindNextFile(hFindFile, &wfd) != 0); FindClose(hFindFile); } }
-
Dieser Thread wurde von Moderator/in rüdiger aus dem Forum Compiler- und IDE-Forum in das Forum WinAPI verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
da gibts nicht viel zu erklaeren, du hast es ja so benutzt wie ich wollte - mein zusatz mit den copy hatte ich nur da ich nicht wusste ob du mit den .c_str() direkt arbeiten kannst oder ein TCHAR brauchst
-
Mr Evil schrieb:
std::tstring strTemp; strTemp = path + _T("\\") + filter; TCHAR *strBuff = new TCHAR[(strTemp.length())+(sizeof(TCHAR))]; _tcscpy_s(strBuff, temp);Du mischt hier aber Zeichensatz unabhängigen Code (siehe TCHAR und _T-Makro) mit ANSI-Only-Code (siehe std::string). Entweder Du definierst einen entsprechenden Typ der sich dem aktuellen Zeichensatz anpasst oder Du instantiierst die Klasse std::basic_string für den Typ TCHAR neu.
Des weiteren ist das sizeof(TCHAR) hier -in der Form- überflüssig:
Mr Evil schrieb:
TCHAR *strBuff = new TCHAR[(strTemp.length())+(sizeof(TCHAR))];Es sollte heißen:
TCHAR* szBuffer = new TCHAR[strTemp.length() + 1];Beim Operator new gibt man nur die Anzahl der benötigten Zeichen an, nicht die benötigten Bytes
.
-
Mr Evil schrieb:
da gibts nicht viel zu erklaeren, du hast es ja so benutzt wie ich wollte - mein zusatz mit den copy hatte ich nur da ich nicht wusste ob du mit den .c_str() direkt arbeiten kannst oder ein TCHAR brauchst
Das sollte sich damit dann auch erklären
.
-
CodeFinder schrieb:
Mr Evil schrieb:
std::tstring strTemp; strTemp = path + _T("\\") + filter; TCHAR *strBuff = new TCHAR[(strTemp.length())+(sizeof(TCHAR))]; _tcscpy_s(strBuff, temp);Du mischt hier aber Zeichensatz unabhängigen Code (siehe TCHAR und _T-Makro) mit ANSI-Only-Code (siehe std::string). Entweder Du definierst einen entsprechenden Typ der sich dem aktuellen Zeichensatz anpasst oder Du instantiierst die Klasse std::basic_string für den Typ TCHAR neu.
ehm, lies mal meine deklaration genau, dann siehst du das dort "std::tstring" definiert, ist - also nichts ansi only sondern multibyte und unicode faehig {o; - ich ging auch davon aus das die variablen path und filter entsprechend deklariert werden #gg
das mit den new {+1} hab ich in meinen source auch immer, hatte das nur falsch in erinnerung hier im topic, es moege mir veriehen sein {o;