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

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

16.10.2013, 21:16. Показов 4582. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru