Не работает данная структура PHP: // octopus.cpp: определяет точку входа для консольного приложения. #include "stdafx.h" #include "headers.h" using namespace std; int filesAndFolders(char bb[5]) { WIN32_FIND_DATA FindFileData; HANDLE hf; hf=FindFirstFileA(bb, &FindFileData); if (hf!=INVALID_HANDLE_VALUE) { do { cout << FindFileData.cFileName << endl; } while (FindNextFile(hf,&FindFileData)!=0); FindClose(hf); } return 0; } int main() { int n; char dd[4], bb[5]; char d; DWORD dr = GetLogicalDrives(); for( int i = 0; i < 26; i++ ) { n = ((dr>>i)&0x00000001); if( n == 1 ) { dd[0] = char(65+i); dd[1] = ':'; dd[2] = '\\'; dd[3] = 0; bb[0] = char(65+i); bb[1] = ':'; bb[2] = '\\'; bb[3] = '*'; bb[4] = 0; d = GetDriveTypeA(dd); if( d == DRIVE_FIXED ) { filesAndFolders(bb); } } } return(0); } 1>octopus.cpp(11): error C2664: FindFirstFileA: невозможно преобразовать параметр 2 из "WIN32_FIND_DATA *" в "LPWIN32_FIND_DATAA" при замене на такое PHP: hf=FindFirstFile(bb, &FindFileData); 1>octopus.cpp(11): error C2664: FindFirstFileW: невозможно преобразовать параметр 1 из "char []" в "LPCWSTR" при замене на такое PHP: hf=FindFirstFile(LPCWSTR(bb), &FindFileData); Компилится и ничего не отображается при замене на такое PHP: hf=FindFirstFile(L"C:\\*", &FindFileData); Компилится но отображаются вместо названий файлов и папок совершенно одинаковый набор символов например 0012FD44 для всех файлов и папок, а надо нормальные имена. Вопрос что делать? Где исправлять? Ещё чутка и придётся новую клаву с мышью покупать.. Короче нид HELP!!!
Попробуй то, что посоветовали в предыдущей теме. Также в MSDN по WIN32_FIND_DATA написано: Насчет Здесь написано, почему так происходит.
)) В листинге описаны все приёмы которые мне подсказали и помогает только один с статическим путём PHP: hf=FindFirstFile(L"C:\\*", &FindFileData); а мне надо что бы через переменную поигрался с WIN32_FIND_DATAW (Unicode) and WIN32_FIND_DATAA (ANSI) эффект тот же Блин уже думаю либо проект на VS6 доделывать придётся всё таки либы подключать для регулярок, что то не вставляет VS10
Если ты хочешь, чтобы твоя программа работала в кодировке ANSI, поставь в начало макрос, как я показал, или ко всем именам функций букву "A" в конец приписывай. Читай предыдущую тему, короче. Только вот ANSI - это прошлый век. Это потому что ты все правильно написал, поставив L перед путем, только вот std::cout, который ты импользуешь, не умеет выводить юникодовые строки (wchar_t*), он выводит только их адреса. Замена cout на wcout решит проблему, только тогда перед всеми статическими строками надо будет написать букву L. Мой совет: использовать юникод (что по умолчанию и предлагают новые студии), не писать никакие постфиксы у имен функций, а перед всеми строками ставить либо букву L, типа: PHP: L"привет" либо обрамлять их в макрос TEXT, раскрывающийся в ту же L для юникодной программы: PHP: TEXT("привет") что, в общем-то, более универсально и позволит потом программу собрать как для ANSI, так и для UNICODE. Хотя кому это сейчас может быть нужно - ума не приложу. Я давно уже испольщую только юникод.
Тебе надо компилировать программу без юникода. Чтобы компилятор сам выбирал ANSI вариант функций. Либо используй переменные нужного типа. А вообще попробуй почитать что тебе пишет компилятор.
Можно попробовать создать класс Unicode чтоб работал как с простой так и с юникодной строкой Code: #include <Windows.h> #include <xstring> typedef std::basic_string<TCHAR, std::char_traits<TCHAR>,std::allocator<TCHAR>>Unicode; int main() { Unicode buf = L"asd"; MessageBoxW(0,buf.c_str(),L"",0); }