ホーム > カテゴリ > C/C++ >

ドライブの容量を取得する(C/C++版)

ドライブの容量を取得するサンプルです。

サンプルの実行画面

ソースコード

[Sample44.c]

//--------------------------------------------------------------------------------------
//  ■ドライブの容量を取得する■ Sample NO.44
//
//--------------------------------------------------------------------------------------

#include <windows.h>

#define ID_COMBO 100

HWND hCombo;

//コールバックプロシージャ
LRESULT CALLBACK  WindowProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam);

//------------------------------------------------------
//■関数 ScreenCenterX(ローカル)
//■用途 ウインドウを中央にする為にX座標(LEFT)を算出する
//■引数
//  Width ...ウインドウの横幅
//------------------------------------------------------
int ScreenCenterX(int Width)
{ 
 int X;
  X = (GetSystemMetrics(SM_CXSCREEN)- Width) / 2;
 if (X<0) X=0;
 return(X);
}

//------------------------------------------------------
//■関数 ScreenCenterY(ローカル)
//■用途 ウインドウを中央にする為にY座標(TOP)を算出する
//■引数
//  Height ...ウインドウの縦幅
//------------------------------------------------------
int ScreenCenterY(int Height)
{ 
 int Y;
 Y= (GetSystemMetrics(SM_CYSCREEN)- Height) / 2;
 if (Y<0) Y=0;
 return(Y);
}

//------------------------------------------------------
//■関数 CreateMainWindow(ローカル)
//■用途 メインウインドウを作成する
//■引数
//  Width       ...ウインドウの横幅
//  Height      ...ウインドウの縦幅
//  Caption     ...タイトル名
//  hInstance   ...インスタンスハンドル
//  nCmdShow    ...ウインドウの表示形態
//  lpfnWndProc ...コールバックプロシージャ
//  dwstyle     ...ウインドウスタイル
//  dwExstyle   ...拡張ウインドウスタイル
//  MenuID      ...メニューのID
//  hIcon       ...アイコン
//■戻り値
//  ウインドウのハンドル
//------------------------------------------------------
HWND CreateMainWindow(int Width,int Height,LPCTSTR Caption,HINSTANCE hInstance,int nCmdShow,WNDPROC lpfnWndProc, DWORD dwstyle,DWORD dwExstyle,LPCTSTR MenuID,HICON hIcon)
{
    HWND hWnd; //メインウインドウのハンドル
    WNDCLASS myClass;  //WNDCLASS構造体
    
   //WNDCLASS構造体を0で初期化
    ZeroMemory(&myClass,sizeof(WNDCLASS));
 
//--->WNDCLASS構造体の設定&ウインドウクラスの登録

    //ウインドウスタイルを設定 
    myClass.style =CS_HREDRAW | CS_VREDRAW; 
    //コールバックプロシージャへのポインタ
    myClass.lpfnWndProc   = lpfnWndProc;
    //インスタンスハンドルを設定
    myClass.hInstance=hInstance;
    //カーソルの設定(Windows標準リソースを使用)  
    myClass.hCursor=LoadCursor(NULL, IDC_ARROW); 
    //ウインドウの背景を設定(デフォルトカラー)
    myClass.hbrBackground=(HBRUSH)COLOR_WINDOW;
    //クラス名の設定(Borland Delphi風)  
    myClass.lpszClassName="TForm";
    //アイコンの指定
    myClass.hIcon =hIcon;
    //メニューの設定
    myClass.lpszMenuName=MenuID;
        
    //ウィンドウ クラスを登録
    RegisterClass(&myClass); 
    
//--->ウインドウの作成&表示
   
    //メインウインドウの生成
    hWnd = CreateWindowEx(
                        //拡張ウインドウスタイル
                         dwExstyle,
                        //登録されたクラス名のアドレス 
                        "TForm",
                        //ウインドウ名
                        Caption,
                        //ウインドウスタイルを設定
                        dwstyle,  
                        //X座標の位置設定
                        ScreenCenterX(Width),
                        //Y座標の位置設定
                        ScreenCenterY(Height),   
                        //横幅を設定
                        Width,   
                        //縦幅を設定
                        Height,  
                        //親ウインドウを設定
                        NULL,
                        //メニューを設定
                        NULL,
                        //インスタンスを識別
                        hInstance, 
                        //作成したウインドウに渡すデータへのポインタ
                        NULL); 
 
    //ウインドウの表示(表示方法はnCmdShowに従う)
    ShowWindow(hWnd, nCmdShow);
    return(hWnd);
}


//------------------------------------------------------
//■関数名  ControlCreate
//■用途    ウインドウ(コントロール)を作成
//■引数
//       hwndParent ...親ウインドウのハンドル
//       Left       ...作成するウインドウの左隅のX座標
//       Top        ...作成するウインドウの左隅のY座標
//       Width      ...作成するウインドウの横幅
//       Height     ...作成するウインドウの縦幅
//       dwExStyle  ...ウインドウの拡張フラグ
//       dwFlag     ...ウインドウの作成フラグ
//       Caption    ...作成するウインドウのキャプション
//       ClassName  ...作成するウインドウクラス名
//       ChildID    ...子ウインドウの識別子
//       hInstance  ...インスタンスハンドル 
//■戻り値
//  子ウインドウのハンドル
//------------------------------------------------------
 HWND CreateControlWindow(HWND hwndParent, int Left, int Top,int Width, int Height,int dwExStyle ,int dwFlag ,LPCTSTR Caption, LPCTSTR ClassName,HMENU ChildID,HINSTANCE hInstance)
 { 
 return CreateWindowEx(dwExStyle,ClassName,Caption,WS_CHILD | WS_VISIBLE | dwFlag    ,
                         Left, Top, Width, Height, hwndParent, ChildID, hInstance, NULL);
 }

//--------------------------------------------------------
//■関数 WinMain
//■用途 メインの関数 
//■引数
// hInstance    ...現在のインスタンスのハンドル
// hPrevInstance...以前のインスタンスのハンドル
// pszCmdLine   ...コマンド ラインのアドレス
// nCmdShow     ...ウィンドウの表示状態
//--------------------------------------------------------
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow)
{
   MSG msg;

  //メインウインドウを作成
  CreateMainWindow(280,280,"ドライブの容量を取得する",hInstance,nCmdShow,(WNDPROC)WindowProc,
       WS_OVERLAPPEDWINDOW,WS_EX_CONTROLPARENT | WS_EX_WINDOWEDGE,NULL,LoadIcon(NULL,MAKEINTRESOURCE(IDI_APPLICATION)));

  //送られてくるメッセージを翻訳してプロシージャに渡す  
  while (GetMessage(&msg, NULL, 0, 0)) 
   {
  TranslateMessage(&msg); 
  DispatchMessage(&msg);   
  } 
 return (msg.wParam);
}
//------------------------------------------------------
// ■関数 WindowProc
// ■用途 メインウインドウに送られるメッセージを処理
// ■引数
//   hwnd    ...ウインドウのハンドル
//   uMsg    ...メッセージID
//   wParam  ...第1メッセージ パラメータ    
//   lParam  ...第2メッセージ パラメータ
//------------------------------------------------------
LRESULT CALLBACK  WindowProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
  DWORD  buffer,i=0;
  char   Path[]=":\\";
  char   str[2],str2[10],str3[100];
  DWORD Sekuta  ; //セクタ(クラスタ当り)
  DWORD nByte   ; //バイト数(セクタ当り)
  DWORD Kurasuta; //フリークラスタ数
  DWORD Drive   ; //ドライブのクラスタ数(合計)
  DWORD FreeSpace;//ディスクの空き容量
  DWORD Youryou  ;//ディスクの容量

  switch (uMsg)
    {
     case WM_CREATE: 
           hCombo= CreateControlWindow(hwnd,10,10,250,120,0,
                             CBS_DROPDOWNLIST |CBS_AUTOHSCROLL|WS_CLIPSIBLINGS |WS_VSCROLL  ,
                             "","COMBOBOX",(HMENU)ID_COMBO,(HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE));   
           //現在使用できるディスクドライブのビットマスクを取得
           buffer= GetLogicalDrives();
           while (i!=26) //0-25はドライブがA-Zまでなので・・・
           {
              //論理積が0ではない時にリストに追加する
              if ((buffer & (1 << i)) !=0) 
              {
                //65は'A'となる。あとはわかりますね。
                 wsprintf(str,"%c",65+i); 
                //文字列結合
                wsprintf(str2,"%s%s",str,Path); 
            
                //ドライブの容量計算---->
                    //旧式の算出方法(2Gを超える場合は正しく計算できませんがWin95(初期)の場合はこれを使って下さい。)
                    Sekuta=0;nByte=0;Kurasuta=0;Drive=0;Youryou=0;FreeSpace=0;
                     //ディスク情報を取得
                    GetDiskFreeSpace(str2, &Sekuta, &nByte, &Kurasuta, &Drive);
                    //ディスク容量を取得
                    Youryou = Sekuta * nByte * Drive ;
                    //空き容量を取得
                    FreeSpace = Sekuta * nByte * Kurasuta;
                    //MBに変換する
                    FreeSpace =(FreeSpace / 1024) / 1024;
                    Youryou   =(Youryou / 1024) /1024;
                    wsprintf(str3,"%s %dMB/%dMB",str2,FreeSpace,Youryou); 
                   //最新版(Win98以降はこれを使用する) ※APIの解説書が英語なので理解できません。すみません。(^^;
                   //GetDiskFreeSpaceEx()API           また、このAPIは2GB以上の容量にも対応しています。

                //ドライブをコンボボックスに追加
                SendMessage(hCombo,CB_ADDSTRING,0,(LPARAM)(LPCSTR)str3); 
              }
            i++;
            }
           break;
     case WM_DESTROY:
           PostQuitMessage(0);
           break;
      default:return(DefWindowProc(hwnd, uMsg, wParam, lParam)); 
    }
   return (0);
}

ソースコード一式のダウンロード

capi_sample44.zip 3,274 バイト

動作環境

このサンプルは 「Windows98」及び「Microsoft Visual C++5.0」「Borland C++ Compiler 5.5」で確認しております。環境が異なる場合は正常に動作しない場合もございますのでご了承下さい。

Visual C++5.0でのコンパイル

VC5.0でサンプルをコンパイルする場合は新規プロジェクト(Win32Application)を作成後、各ファイルを追加してビルドしてください。

Borland C++ Compiler 5.5でのコンパイル

BCC5.5でサンプルをコンパイルする場合は「bcc32.exe」で*.c又は*.cppファイルをコンパイルします。リソースがある場合は「brc32.exe」で*resファイルを付与してください。

サンプルについて

このWindows APIサンプル集(C/C++版)は2000年頃にC/C++言語の学習の為に作成したものです。コードはエレガントではなく「初心者レベルのコーディング」です。仕事などの業務で利用する際にはエラー処理やメモリ解放などの再確認を必ずして下さい。





関連記事



公開日:2015年03月19日
記事NO:00500