С Новым годом! Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.95/22: Рейтинг темы: голосов - 22, средняя оценка - 4.95
1 / 1 / 0
Регистрация: 16.10.2013
Сообщений: 5

Как реализовать работу с дисками компьютера в C++ Visual с использованием Win32 API

16.10.2013, 21:16. Показов 4549. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток. У меня есть вопрос по реализации работы функции GetDiskFreeSpace. Я находил примеры в интернете для реализации этой функции, но они были написаны в консольном режиме ( Информация о свободном месте на жестких дисках), мне же нужно написать ее с помощью Win32 API в оконном режиме. Как отобразить результат и можно ли это сделать с помощью MessageBox(), или есть какой-то метод попроще? Помогите пожалуйста.
P.S. Было бы неплохо если бы у пользователя была возможность выбирать диск из имеющихся на данный момент.
1
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
16.10.2013, 21:16
Ответы с готовыми решениями:

В Win32 Api под Visual Studio что-то не так с кодировками
Здравствуйте, решил освоить Win32 Api, работаю в Visual Studio 2017. При помощи команды TextOut пытаюсь вывести кириллический текст. В...

Работа с дисками с использованием функций API
Разработать программу, использующую стандартные функции API, для индикации следующих показателей файловой системы: Определение количество...

Консольный мессенджер VK, подскажите как реализовать работу с API, пожалуйста
Хочу написать консольный месенджер вконтакте, только с апи проблемы - никак не могу понять. Порывшись в "интернетах", я нашел...

9
87 / 86 / 27
Регистрация: 04.10.2012
Сообщений: 355
17.10.2013, 04:13
C++
1
2
3
4
5
6
7
8
9
#include <windows.h>
#include <stdio.h>
 
bool __fastcall ShowFreeSpace(const TCHAR *Path) {
  ULARGE_INTEGER size;
  if (!GetDiskFreeSpaceEx(Path, NULL, NULL, &size)) return false;
  char message[21];
  sprintf_s(message, "%llu", size.QuadPart);
  return MessageBoxA(NULL, message, NULL, 0);}
1
1 / 1 / 0
Регистрация: 16.10.2013
Сообщений: 5
17.10.2013, 11:48  [ТС]
Цитата Сообщение от mytilus Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
#include <windows.h>
#include <stdio.h>
 
bool __fastcall ShowFreeSpace(const TCHAR *Path) {
  ULARGE_INTEGER size;
  if (!GetDiskFreeSpaceEx(Path, NULL, NULL, &size)) return false;
  char message[21];
  sprintf_s(message, "%llu", size.QuadPart);
  return MessageBoxA(NULL, message, NULL, 0);}
Вот Вам для примера кусок моего программного кода:

****************************
LPCSTR RootPathName;
LPCTSTR RootPathName1;
LPDWORD SectorsPerCluster;
LPDWORD BytesPerSector;
LPDWORD NumberOfFreeClusters;
LPDWORD TotalNumberOfClusters;
DWORD FREE;
****************************

case IDM_GDFS:

GetDiskFreeSpace (
"C:\\",
SectorsPerCluster,
BytesPerSector,
NumberOfFreeClusters,
TotalNumberOfClusters
);
FREE=SectorsPerCluster*BytesPerSector* NumberOfFreeClusters;
MessageBox(hWindow, "Вильно:" + (FREE), "Повідомлення", MB_OK);
break;

Вот примерно так я хочу реализовать, но вот выдает ошибку тут (FREE=SectorsPerCluster*BytesPerSector* NumberOfFreeClusters; ) с типамы данных, я что-то не разобрался, учил с++ очень давно уже, а тут как бы появилась нужда. И что-то мне подсказует что с MessageBox() я тож намутил.

Добавлено через 15 минут
Все проблема с типамы данных решена, написал следующий код:

FREE=(DWORD64)SectorsPerCluster*(DWORD64 )BytesPerSector*(DWORD64)NumberOfFreeClu sters;

Осталось сделать вывод информации, и выбор диска, помогите пожалуйста. Думал выбор сделать через comboBox но понятия не имею как это сделать. Там есть фукция getlogicaldrives но как ее использовать я низнаю.
0
87 / 86 / 27
Регистрация: 04.10.2012
Сообщений: 355
17.10.2013, 19:41
Конкатекация строк не может быть организована операцией "+". "Hello " + "World!" - это не "Hello World!". Это сумма двух адресов памяти. Для слияния строк используйте функцию strcat.
Насчет комбобокса ничего не посоветую, пусть другие напишут. Потому что я не работаю с IDE.
Используйте функцию, которую я предложил. Чтобы было именно так, как у вас, замените в ней строки 8 и 9 на:
C++
1
2
  sprintf_s(message, "Вильно: %llu.", size.QuadPart);
  return MessageBoxA(NULL, message, "Повідомлення", 0);}
Тогда, чтобы появилось окно с инфой о свободном пространстве диска (С:), просто вызовите
C++
1
ShowFreeSpace(TEXT("C:\\"));
И еще: обратите внимание, что я пользовался не GetDiskFreeSpace(), а GetDiskFreeSpaceEx(). Это избавляет от необходимости производить дополнительные вычисления в своем коде.
1
1 / 1 / 0
Регистрация: 16.10.2013
Сообщений: 5
17.10.2013, 20:58  [ТС]
Я понимаю что GetDiskFreeSpaceEx() проще, и не будет приколов если памяти больше 2 Гб, но это часть курсовой, и тут уже никак не замениш.
Может как-то через Memo вывести информацию, может так будет проще?

А как выбрать диск Вы не подскажете?
0
87 / 86 / 27
Регистрация: 04.10.2012
Сообщений: 355
17.10.2013, 21:43
Почему бы не создать текстовое поле, в которое юзер будет писать нужный ему диск?
0
1 / 1 / 0
Регистрация: 16.10.2013
Сообщений: 5
17.10.2013, 22:09  [ТС]
Цитата Сообщение от mytilus Посмотреть сообщение
Почему бы не создать текстовое поле, в которое юзер будет писать нужный ему диск?
Одно из завдань это фукнция GetLogicalDrives. Ее суть я понял но как привязать ее я не представляю. Там возвращается число и судя по этому числу я узнаю сколько у меня разделов на винчестере и дисков вообще.
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
18.10.2013, 00:23
z0iberg, держи
Ошибка при открытие CD-ROW в коде

В проекте на много больше чем тебе нужно (контекстное меню(меню по правой кнопке мыши), трей и бинго - возможность вытолкнуть любой лоток из РОМ-ов системы)
1
1 / 1 / 0
Регистрация: 16.10.2013
Сообщений: 5
18.10.2013, 09:35  [ТС]
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
z0iberg, держи
Ошибка при открытие CD-ROW в коде

В проекте на много больше чем тебе нужно (контекстное меню(меню по правой кнопке мыши), трей и бинго - возможность вытолкнуть любой лоток из РОМ-ов системы)
Я конешно извеняюсь но где там создание Button и CheckBox, потому что у меня в программе все создается с помощью CreateWindow, и то что я делаю узнаю с помощью
C++
1
2
3
4
case IDM_EXIT:       
                    MessageBox(hWindow, "Програма закінчила виконання", "Повідомлення", MB_OK);
                    PostQuitMessage(0);     //повідомлення системі, що потік потребує закриття
                    break;
К примеру. А вот в Вашем коде я не могу ничего понять.
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
19.10.2013, 11:45
z0iberg, прочти Этапы создания MFC приложения
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.10.2013, 11:45
Помогаю со студенческими работами здесь

Скажите, пожалуйста, как правильно реализовать работу методов класса в lua api c++
вот самая простая структура. как вызвать ее конструктор и метод в lua. Подскажите, пожалуйста. using namespace std; struct...

Нажать кнопку в другом приложении с использованием Win32 API
public partial class Form1 : Form { public static extern IntPtr FindWindowEx(IntPtr hwndParent,...

Создание проекта win32 api в среде visual studio
Скажите как создать проект win32 api, но с конструктором(не чистый winapi)В среде visual studio

Разработка GUI средствами Win32 Api в среде программирования Visual C++
Разрабатываю программу на Win32 Api в среде программирования Visuol C++. Столкнулся с двумя проблеммами: 1. Подскажите пожалуйста,...

Win32 API, как создать меню?
Здраствуйте помогите пожалуста. Нужно до простой программы каторая выводит пустое окно добавить меню с пунктамы Fille который имеет...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru