Модераторы: feodorv, GremlinProg, xvr, Fixin

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> GetDiskFreeSpaceEx, Проблема с соответсвием действительности 
V
    Опции темы
rAccOOn
Дата 7.10.2009, 09:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 8.1.2009

Репутация: нет
Всего: нет



Здраствуйте, вот код
Код

void CUhygDlg::OnButton1() 
{
    char mas[20];
    unsigned long Available, Total, Free;
    list.ResetContent();
    char dd[4];
    DWORD dr = GetLogicalDrives();
    for( int i = 0; i < 26; i++ )
    {
        int n = ((dr>>i)&0x00000001);
        if( n == 1 ) 
        {
            dd[0] =  char(65+i); dd[1] = ':'; dd[2] = '\\'; dd[3] = 0;
            list.AddString(dd);    
        }
    }    
    list_a.ResetContent();
    int d;
    UpdateData(true);
        d = GetDriveType(ed); // ed- эдит в который вводится название раздела о котором нужна инфа
    if( d == DRIVE_UNKNOWN ) list_a.AddString(" Íåèçâåñòíûé");
    if( d == DRIVE_NO_ROOT_DIR )list_a.AddString(" Íåèçâåñòíûé");
    if( d == DRIVE_REMOVABLE )list_a.AddString( " Cìåííûé");
    if( d == DRIVE_FIXED ) list_a.AddString(" Ëîêàëüíûé");
    if( d == DRIVE_REMOTE ) list_a.AddString(" Ñåòåâîé");
    if( d == DRIVE_CDROM ) list_a.AddString(" CD-ROM");
    if( d == DRIVE_RAMDISK ) list_a.AddString(" Âèðòóàëüíûé â ÎÇÓ");
    UpdateData(false);


        if(GetDiskFreeSpaceEx("d:\\", (PULARGE_INTEGER)&Available,(PULARGE_INTEGER)&Total,(PULARGE_INTEGER)&Free))
        {
                ed1=itoa(Total, mas, 10);
                ed2=itoa(Free, mas, 10);
                ed3=itoa(Available, mas, 10);
                UpdateData(false);
        }
}


Вообщем при нажатии на кнопку, програма выводит список разделов, при попытке получить обьем памяти вообе, обьема свободной и обьема занятой выводит какие то не понятные числа.
user posted image
Подскажите кто может где я ошибаюсь и как это исправить 
PM MAIL   Вверх
jonie
Дата 7.10.2009, 09:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 7
Всего: 118



http://msdn.microsoft.com/en-us/library/aa...28VS.85%29.aspx
ULARGE_INTEGER это НЕ unsigned long тип.
sizeof(long) = 4 (на x86 , впрочем и на x64 в видении майкрософта тоже 4), у вас странно что вообще не вылетает все нафиг, т.к. вы перещаписываете буфер.


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
xvr
Дата 7.10.2009, 12:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 40
Всего: 223



Кстати, ваш GetDiskFreeSpaceEx всегда возвращает свободное место на диске D: (см его первый параметр). Это так и было задумано?

PM MAIL   Вверх
rAccOOn
Дата 7.10.2009, 17:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 8.1.2009

Репутация: нет
Всего: нет



Цитата(xvr @ 7.10.2009,  12:22)
Кстати, ваш GetDiskFreeSpaceEx всегда возвращает свободное место на диске D: (см его первый параметр). Это так и было задумано?

Да, я хотел выводить пока тока диск D, п потом когда уже пойму как это делать то можна будет и поменять.

Добавлено @ 18:02
Код

void CUhygDlg::OnButton1() 
{
    char mas[10];
    __int64 Available;
    __int64 Total;
    __int64 Free;
    list.ResetContent();
    char dd[4];
    DWORD dr = GetLogicalDrives();
    for( int i = 0; i < 26; i++ )
    {
        int n = ((dr>>i)&0x00000001);
        if( n == 1 ) 
        {
            dd[0] =  char(65+i); dd[1] = ':'; dd[2] = '\\'; dd[3] = 0;
            list.AddString(dd);    
        }
    }    
    list_a.ResetContent();
    int d;
    UpdateData(true);
        d = GetDriveType(ed);
    if( d == DRIVE_UNKNOWN ) list_a.AddString("Oei: Iaecaanoiue");
    if( d == DRIVE_NO_ROOT_DIR )list_a.AddString("Oei: Iaecaanoiue");
    if( d == DRIVE_REMOVABLE )list_a.AddString( "Oei: Ciaiiue");
    if( d == DRIVE_FIXED ) list_a.AddString("Oei: Eieaeuiue");
    if( d == DRIVE_REMOTE ) list_a.AddString("Oei: Naoaaie");
    if( d == DRIVE_CDROM ) list_a.AddString("Oei: CD-ROM");
    if( d == DRIVE_RAMDISK ) list_a.AddString("Oei: Ae?ooaeuiue a ICO");
    UpdateData(false);


        if(GetDiskFreeSpaceEx("e:\\", (PULARGE_INTEGER)&Available,(PULARGE_INTEGER)&Total,(PULARGE_INTEGER)&Free))
        {
                ed1=itoa(Total, mas, 10);
                ed2=itoa(Free, mas, 10);
                ed3=itoa(Available, mas, 10);
                UpdateData(false);
        }

}



Теперь же при выводе получаються вот такие значения
user posted image

Хотя у меня на диске D: 476937 метров общий обьем. Возможно я не так преобразовую полученые данные, но если убрать преобразование полностью то вылазиет 3 ошибки о том что при переводе могут потеряться данные. и у меня появилась мысль о том что может надо переводить не в char а в какой то другой тип, или сделать надо что то еще или наоборот что то другое. 

PS: спасибо за разяснение на счет типов даных

Это сообщение отредактировал(а) rAccOOn - 7.10.2009, 18:03
PM MAIL   Вверх
jonie
Дата 7.10.2009, 18:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 7
Всего: 118



Цитата

PS: спасибо за разяснение на счет типов даных
а почему не применили? И тип __int64 это НЕ тоже самое что ULARGE_INTEGER (хотя с натягом иожно сказать что это unsigned __int64).

более того, itoa НЕ работает с __int64 данными, он преобразует ваш int64 к int и получает данные (с потерями, что немудрено)...

Это сообщение отредактировал(а) jonie - 7.10.2009, 18:25


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
rAccOOn
Дата 7.10.2009, 19:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 8.1.2009

Репутация: нет
Всего: нет



я просто не понял как его правильно использовать, и как его можна всунуть. Еси можете и вам не сложно напишите пример на одной из трех переменых. заранее спс 
PM MAIL   Вверх
dumb
Дата 8.10.2009, 08:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 27
Всего: 158



Код

  ULARGE_INTEGER Available, Total, Free;
  TCHAR ed1[32], ed2[32], ed3[32];
  if(GetDiskFreeSpaceEx(_T("e:\\"), &Available,&Total,&Free))
  {
    _stprintf_s(ed1, _T("%llu"), Total);
    _stprintf_s(ed2, _T("%llu"), Free);
    _stprintf_s(ed3, _T("%llu"), Available);
    UpdateData(false);
  }

PM MAIL   Вверх
rAccOOn
Дата 8.10.2009, 09:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 8.1.2009

Репутация: нет
Всего: нет



Может для этого надо еще какую то библеотеку подключить, потому что при компиленге вылазиет ошибка
Код

error C2065: '_stprintf_s' : undeclared identifier 


Или обьявить его как то надо было. 

Это сообщение отредактировал(а) rAccOOn - 8.10.2009, 09:21
PM MAIL   Вверх
xvr
Дата 8.10.2009, 09:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 40
Всего: 223



Цитата(rAccOOn @ 8.10.2009,  09:21)
Может для этого надо еще какую то библеотеку подключить, потому что при компиленге вылазиет ошибка
Код

error C2065: '_stprintf_s' : undeclared identifier 


Или обьявить его как то надо было.

Угу, VS2005 называется  smile 
PM MAIL   Вверх
dumb
Дата 8.10.2009, 10:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 27
Всего: 158



замени _stprintf_s на sprintf
PM MAIL   Вверх
rAccOOn
Дата 8.10.2009, 11:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 8.1.2009

Репутация: нет
Всего: нет



аа, я пишу прогу на Visual C++ 6.0

Добавлено через 4 минуты и 57 секунд
Страно, но теперь вообще ничего не выводится. 
PM MAIL   Вверх
rAccOOn
Дата 8.10.2009, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 8.1.2009

Репутация: нет
Всего: нет



а при попытке вывести значения ed1, ed2, ed3 в лист бокс, он их выводит но тоже какие то неестественые числа
Код
            
list_a.AddString(ed1);
list_a.AddString(ed2);
list_a.AddString(ed3);


на выходе получаються числа
user posted image
получаеться числа немного изменились но до правды далековато. Но оно работает просто как то некоректно, потому что при попытке вывести ту же инфу о дисководе или о несуществующем разделе ничего не выводит.
PM MAIL   Вверх
xvr
Дата 8.10.2009, 11:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 40
Всего: 223



Цитата(rAccOOn @ 8.10.2009,  11:00)
аа, я пишу прогу на Visual C++ 6.0

Добавлено @ 11:05
Страно, но теперь вообще ничего не выводится.

У VS (в особенности у 6й) формат печати __int64 другой -
Код

sprintf(ed1,"%Lu",Total);
sprintf(ed2,"%Lu", Free);
sprintf(ed3,"%Lu", Available);

PM MAIL   Вверх
GremlinProg
Дата 8.10.2009, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



http://msdn.microsoft.com/en-us/library/tcxf1dw6(VS.80).aspx
Цитата(Size and Distance Specification @ MSDN)

To Specify Use Prefix With Type Specifier 
long int l d, i, o, x, or X 
long unsigned int l u 
short int h d, i, o, x, or X 
short unsigned int h u 
__int64 I64 d, i, o, u, x, or X 
Single-byte character with printf functions  h c or C 
Wide character with printf functions l c or C 
Single-byte – character string with printf functions h s or S 
Wide-character string with printf functions l s or S 

для беззнакового:
Код

...
sprintf( ed1, "%I64u", Total );
...

для знакового:
Код

...
sprintf( ed1, "%I64i", Total );
...

этот формат вроде бы поддерживался везде


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
rAccOOn
Дата 8.10.2009, 21:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 8.1.2009

Репутация: нет
Всего: нет



Это конечно страно но не первый метод ни второй не дал результата
Код

void CUhygDlg::OnButton1() 
{
            ULARGE_INTEGER Available, Total, Free;
    TCHAR ed1[32], ed2[32], ed3[32];
    list.ResetContent();
    char dd[4];
    DWORD dr = GetLogicalDrives();
    for( int i = 0; i < 26; i++ )
    {
        int n = ((dr>>i)&0x00000001);
        if( n == 1 ) 
        {
            dd[0] =  char(65+i); dd[1] = ':'; dd[2] = '\\'; dd[3] = 0;
            list.AddString(dd);    
        }
    }    
    list_a.ResetContent();
    int d;
    UpdateData(true);
        d = GetDriveType(ed);
    if( d == DRIVE_UNKNOWN ) list_a.AddString("Oei: Iaecaanoiue");
    if( d == DRIVE_NO_ROOT_DIR )list_a.AddString("Oei: Iaecaanoiue");
    if( d == DRIVE_REMOVABLE )list_a.AddString( "Oei: Ciaiiue");
    if( d == DRIVE_FIXED ) list_a.AddString("Oei: Eieaeuiue");
    if( d == DRIVE_REMOTE ) list_a.AddString("Oei: Naoaaie");
    if( d == DRIVE_CDROM ) list_a.AddString("Oei: CD-ROM");
    if( d == DRIVE_RAMDISK ) list_a.AddString("Oei: Ae?ooaeuiue a ICO");
    UpdateData(false);


        if(GetDiskFreeSpaceEx("e:\\", &Available,&Total,&Free))    
        {
                sprintf(ed1,"%Lu",Total);
                sprintf(ed2,"%Lu", Free);
                sprintf(ed3,"%Lu", Available);
             UpdateData(false);
        }

}



Посмотрите пожалуйста, вот это полный код програмы, возможно что то мишает выводу. Или может дето чего то не хватает поэтому ничего и не выводится. 
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.1098 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.