MFC에서 디스크 포멧(Disk Format)하기 | |||
| |||
첫 번째는 Shell32.dll내의 SHFormatDrive라는 함수를 호출하는 방법이다. 이 함수의 prototype은 DWORD WINAPI SHFormatDrive(HWND hwnd, UINT drive, UINT fmtID, UINT options);이며 이에 대한 내용은 msdn에서 자세히 볼 수 있다. HOWTO: call SHFormatDrive in Windows 95 and Windows NT ID : Q173688 하지만 이 함수의 경우 Shell의 Format Dialog를 띄워주는 방식으로 대부분의 개발자라면 이러한 방법 보다는 아래와 같은 방법을 더욱 필요로 할 것이라 생각한다. 두 번째는 fmifs.dll내의 FormatEx라는 함수를 호출하는 방법이다. 이 함수의 prototype은 VOID (__stdcall *PFORMATEX)(PWCHAR DriveRoot, DWORD MediaFlag, PWCHAR Format, PWCHAR Label, BOOL QuickFormat, DWORD ClusterSize, PFMIFSCALLBACK Callback);이다. 추가로 위의 DLL에서는 Chkdsk 함수를 통해 Check Disk도 할 수 있는 함수가 있다. 위의 함수 중 마지막 parameter는 Callback 함수를 지정하는 곳인데 이 callback 함수를 통해 진행률과 결과를 알 수 있다. Callback 함수의 prototype은 아래와 같다. BOOLEAN (__stdcall *PFMIFSCALLBACK)(CALLBACKCOMMAND Command, DWORD SubActiion, PVOID ActionInfo); 그러면 지금부터 FormatEx함수를 사용하는 방법에 대하여 이야기를 하겠다. 1. LoadLibrary를 통해 : fmifs.dll을 load한다. (fmifs.dll은 Windows 폴더의 system32에 있다. 2. GetProcAddress 함수를 통해 FormatEx 함수의 주소를 얻어온다. ex) PFORMATEX FormatEx = (PFORMATEX)GetProcAddress(GetModuleHandle("fmifs.dll"), "FormatEx"); 3. Format 하고자 하는 드라이브를 WCHAR 형식으로 저장한다. - WCHAR를 배열로 선언하고 - 0번지에는 드라이브 이름이(L"C") - 1번지에는 콜론이(L":") - 2번지에는 back slash가(L"") - 3번지에는 NULL값이((WCHAR)NULL) 들어간다. 4. GetDriveType 또는 GetDriveTypeW 함수를 통해 drive의 type을 알아낸다. - WCHAR를 사용하므로 postfix가 W인 함수 사용 - DRIVE_FIXED인 경우 아래에 나올 media에 FMIFM_FLOPPY를 아닌 경우 FMIFM_HARDDISK · FMIFM_FLOPPY : 0x08 · FMIFM_HARDDISK : 0x0C 5. GetVolumeInformationW 함수를 이용하여 disk에 대한 정보를 얻어온다. 6. FormatEx 함수를 호출하여 format을 수행한다. - Parameter 설명 1 : Root Directory (3번의 변수) 2 : Media (4번의 media 변수) 3 : File System (5번에서 얻은 File System 혹은 WCHAR로 L"FAT", L"FAT32", L"NTFS" 지정) 4 : Volume Name (WCHAR로 지정할 disk의 volume 지정) 5 : Quick Format (TRUE(quick) or FALSE(normal)로 Quick 여부를 지정) 6 : Cluster Size (설정할 cluster size 지정) 7 : Callback Function (Callback 함수의 이름 지정) 7. Callback함수를 통해 format에 대한 정보를 얻는다. ex) BOOLEAN __stdcall FormatExCallback(CALLBACKCOMMAND Command, DWORD Modifier, PVOID Argument) { PDWORD percent; PTEXTOUTPUT output; PBOOLEAN status; static createStructures = FALSE; switch(Command) { case PROGRESS : percent = (PDWORD)Argument; // ... break; case OUTPUT : output = (PTEXTOUTPUT)Argument; // ... break; case DONE : status = (PBOOLEAN)Argument; if(*status == TRUE) // ... Success else // ... Failure break; } return TRUE; } 출처: http://ultracap.tistory.com/ Tags: DiskFormat DiskFormatEx FormatEx SHFormatDrive fmifs 디스크포멧 디스크포멧API 윈도우즈 | |||
| |||
| |||
Login for comment |