1. Пользуйтесь тегами кода. - [code] ... [/code] 2. Точно указывайте язык, название и версию компилятора (интерпретатора). 3. Название темы должно быть информативным. В описании темы указываем язык!!!
Требуется определить свободное место на диске.. Сначала хочу получить список всех дисков в системе, чтобы потом для каждого применить функцию GetDiskFreeSpaceEx().. Как раз проблема с получением дисков..
GetLogicalDriveStrings(MAX_PATH_SIZE,drive) возвращает 16.. В итоге получают в drive только C:\...ну а ещё в системе есть D и E.. Объясните пожалуйста, я в чём-то не права?
A pointer to a buffer that receives a series of null-terminated strings, one for each valid drive in the system, plus with an additional null character. Each string is a device name.
Понимаешь, в чем дело? Не одну строку содержит буфер, которая заканчивается нулем, а несколько строк, разделенных нулями. А если ты просто печатаешь буфер, то печатается все как раз до первого нуля-разделителя... Вот так будет работать:
wchar_t drive[MAX_PATH_SIZE] = {0}; wchar_t Drives[3] = {0}; wchar_t *p; if (GetLogicalDriveStringsW(MAX_PATH_SIZE, drive)) { p = drive; do { wsprintfW(Drives, L"%s", p); SendMessage(hListBox,LB_ADDSTRING, 0, (LPARAM)(LPCSTR)Drives); // Memo1->Lines->Add(Drives); while(*p++); } while(*p);
Опять VC++ ... И Борланд С++ 2009 и GCC работают прекрасно (причем CodeGuard молчит как рыба, ничего не замечает... Так же как и CodeProfiler). Может, VC хочет
wchar_t Drives[4] = {0};
, чтобы поместить в Drives и три символа, и нуль-терминатор?
, чтобы поместить в Drives и три символа, и нуль-терминатор?
Да, действительно! Спасибо! Ну а теперь что касается получения информации о дисковом пространстве.. У меня на ListBox есть список дисков, выделяю любую строку - по нажатию соответствующей кнопки на Edit должна выводиться информация по выбранному диску..Проблема в том, что не получается вывести значение параметров, содержащих общее кол-во байт на диске и количество свободных байт..
wchar_t szBuf[256]={},szStr[256]={}; ULARGE_INTEGER TotalNumberOfBytes; ULARGE_INTEGER TotalNumberOfFreeBytes; int nSelected = SendMessage(hListBox,LB_GETCURSEL,0,0); SendMessage(hListBox,LB_GETTEXT,nSelected,(LPARAM)szBuf); GetDiskFreeSpaceEx(szBuf,NULL,&TotalNumberOfBytes,&TotalNumberOfFreeBytes); SendMessage(hEditTotal,WM_SETTEXT, 0,(LPARAM)(LPCSTR)TotalNumberOfBytes/1024); //<-- error C2440:'type cast' : cannot convert from 'ULARGE_INTEGER' to 'LPCSTR' //SendMessage(hEditFree,WM_SETTEXT, 0, (LPARAM)(LPCSTR)TotalNumberOfFreeBytes/1024);
wchar_t s[16] = {0}; // Я не думаю, что строка будет больше 10 символов (это уже терабайты), // но на всякий случай оставляю 16 ... wsprintf(s, L"%I64d", TotalNumberOfBytes.QuadPart/1024); SendMessage(hEditTotal, WM_SETTEXT, 0, (LPARAM)(LPCSTR)s);