IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

 
 Ответить  Открыть новую тему 
> Свободное место на диске, VC++ 2008 EE
сообщение
Сообщение #1


Профи
****

Группа: Пользователи
Сообщений: 920
Пол: Женский
Реальное имя: Марина

Репутация: -  2  +


Требуется определить свободное место на диске..
Сначала хочу получить список всех дисков в системе, чтобы потом для каждого применить функцию GetDiskFreeSpaceEx()..
Как раз проблема с получением дисков..

#define MAX_PATH_SIZE 260
.......
wchar_t drive[MAX_PATH_SIZE]={0};
if (GetLogicalDriveStrings(MAX_PATH_SIZE,drive))
{
SendMessage(hListBox,LB_ADDSTRING, 0, (LPARAM)(LPCSTR)drive);
}


GetLogicalDriveStrings(MAX_PATH_SIZE,drive) возвращает 16..
В итоге получают в drive только C:\...ну а ещё в системе есть D и E..
Объясните пожалуйста, я в чём-то не права?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Цитата
lpBuffer [out]

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);

}
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Профи
****

Группа: Пользователи
Сообщений: 920
Пол: Женский
Реальное имя: Марина

Репутация: -  2  +


При компиляции возникла вот такая ошибка:

Run-Time Check Failure #2 - Stack around the variable 'Drives' was corrupted.

Скажите пожалуйста, с чем это может быть связано?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






Опять VC++ ... И Борланд С++ 2009 и GCC работают прекрасно (причем CodeGuard молчит как рыба, ничего не замечает... Так же как и CodeProfiler). Может, VC хочет
wchar_t Drives[4] = {0};
, чтобы поместить в Drives и три символа, и нуль-терминатор?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Профи
****

Группа: Пользователи
Сообщений: 920
Пол: Женский
Реальное имя: Марина

Репутация: -  2  +


Цитата(volvo @ 23.11.2008 1:46) *

Может, VC хочет
wchar_t Drives[4] = {0};
, чтобы поместить в 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);



Подскажите пожалуйста, как здесь нужно?

Сообщение отредактировано: 18192123 -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






Цитата
как здесь нужно?
Конвертировать в строку (причем обрати внимание на описатель формата), и потом уже ее как обычно передавать куда нужно:

	GetDiskFreeSpaceEx(szBuf, NULL, &TotalNumberOfBytes, &TotalNumberOfFreeBytes);

wchar_t s[16] = {0};
// Я не думаю, что строка будет больше 10 символов (это уже терабайты),
// но на всякий случай оставляю 16 ...
wsprintf(s, L"%I64d", TotalNumberOfBytes.QuadPart/1024);
SendMessage(hEditTotal, WM_SETTEXT, 0, (LPARAM)(LPCSTR)s);

wsprintf(s, L"%I64d", TotalNumberOfFreeBytes.QuadPart/1024);
SendMessage(hEditFree, WM_SETTEXT, 0, (LPARAM)(LPCSTR)s);

 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 24.10.2021 0:56
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name