2015-09-12 1 views
-1

Я знаю, какой диск в формат, используя этот код:Как быстро отформатировать USB-накопитель в коде

function IsRemovableDrive(Drive: Char): Boolean; 
begin 
Result := (Winapi.Windows.GetDriveType(PChar(Drive + ':\')) = Winapi.Windows.Drive_Removable); 
end; 

Я попробовал этот код:

const 
SHFMT_DRV_A = 0; 
SHFMT_DRV_B = 1; 
SHFMT_ID_DEFAULT = $FFFF; 
SHFMT_OPT_QUICKFORMAT = 0; 
SHFMT_OPT_FULLFORMAT = 1; 
SHFMT_OPT_SYSONLY = 2; 
SHFMT_ERROR = -1; 
SHFMT_CANCEL = -2; 
SHFMT_NOFORMAT = -3; 

function SHFormatDrive(hWnd: HWND; Drive: Word; fmtID: Word; Options: Word): Longint stdcall; external 'Shell32.dll' Name 'SHFormatDrive'; 


procedure TForm2.btnFormatClick(Sender: TObject); 
var 
    FmtRes: Longint; 
    cCharTemp : Char; 
begin 
    try 
    cCharTemp := edtDrive.Text[1]; // edtDrive.Tex := 'E'; 
    FmtRes := ShFormatDrive(Handle, Ord(cCharTemp), SHFMT_ID_DEFAULT, SHFMT_OPT_QUICKFORMAT); 
    case FmtRes of 
     SHFMT_ERROR: ShowMessage('Error formatting the drive'); 
     SHFMT_CANCEL: ShowMessage('User canceled formatting the drive'); 
     SHFMT_NOFORMAT: ShowMessage('No Format') 
     else 
      ShowMessage('Disk has been formatted!'); 
    end; 
    except 
    ShowMessage('Error Occured!'); 
    end; 
end; 

Когда я пытаюсь запустить код это он всегда говорит «Ошибка форматирования диска» Где я ошибся?

+0

Что Google сказал вам до сих пор? –

+0

Я пробовал эту ссылку, но ошибка: http://www.swissdelphicenter.ch/en/showcode.php?id=226 – Ago

+0

Вы должны быть более конкретными и непосредственно в своем вопросе, а не позже в комментариях. Как это происходит? Где вы получаете сообщение об ошибке? Что происходит, в отличие от того, что должно произойти? Если вы получите сообщение об ошибке, какой текст сообщения об ошибке? –

ответ

3

Последние три параметра: UINT, 32-разрядный тип. Объявите их так, а не 16 бит Word.

Параметр привода документируется, как это:

Привод в формат. Значение этого параметра представляет собой буквенный диск, начинающийся с 0 для диска A :. Например, значение 2 означает диск C :.

Вы передаете порядковое значение ASCII для буквы. Вам необходимо преобразовать 'E' в 4. Возможно, вот так: ord(driveChar) - ord('A').

Как я прочитал документы, перейдите $0001 как options для быстрого формата.

Как всегда при работе с Windows API, держать документацию близко: https://msdn.microsoft.com/en-us/library/windows/desktop/bb762169.aspx

Вам будет интересно в этом замечании можно найти там:

Формат управляется с помощью интерфейса диалогового окна , То есть пользователь должен нажать кнопку «ОК», чтобы фактически начать формат, - формат не может быть запущен программно.

Ваш обработчик исключений бесполезен, поскольку ни одна из функций внутри блока try/except не должна создавать исключения.

+0

Я пробовал "ord (driveChar) - ord ('A')", но все же я получаю ошибку. Я также пробовал пропустить $ 0001, но все же ошибку. Я даже передал «4» в качестве диска, но все еще ошибся. Я уже много часов гуляю, но не могу найти ответа. Есть ли у кого-нибудь предложения? или другое решение? Я просто хочу быстро форматировать диск с очень ограниченным вмешательством пользователя. – Ago

+0

Вы прочитали мой ответ? Прочтите первый параграф еще раз и исправьте объявление функции. Вы прочитали последний параграф? Будет вмешательство пользователя? Вы читали документы MSDN? Если ответ на любой из этих вопросов, если нет, почему я трачу время на это? –

+0

Я никогда не знал, что Word и UINT будут иметь значение. Сейчас он работает. Благодарю. Я отправлю свой рабочий исходный код в качестве ответа. – Ago

0
const 
    SHFMT_DRV_A = 0; 
    SHFMT_DRV_B = 1; 
    SHFMT_ID_DEFAULT = $FFFF; 
    SHFMT_OPT_QUICKFORMAT = 0; 
    SHFMT_OPT_FULLFORMAT = 1; 
    SHFMT_OPT_SYSONLY = 2; 
    SHFMT_ERROR = -1; 
    SHFMT_CANCEL = -2; 
    SHFMT_NOFORMAT = -3; 

function SHFormatDrive(
    hWnd: HWND; 
    Drive: UINT; 
    fmtID: UINT; 
    Options: UINT 
): DWORD; stdcall; external 'Shell32.dll'; 

procedure TForm2.btnFormatClick(Sender: TObject); 
var 
    FmtRes: Longint; 
    cCharTemp : Char; 
    nDrive : UINT; // this makes all the difference, declare its like this 
begin 
    try 
    cCharTemp := edtDrive.Text[1]; // edtDrive.Text := 'E'; 
    nDrive := Ord(cCharTEmp) - Ord('A'); 
    FmtRes := ShFormatDrive(Handle, nDrive, SHFMT_ID_DEFAULT, SHFMT_OPT_QUICKFORMAT); 
    case FmtRes of 
     SHFMT_ERROR: ShowMessage('Error formatting the drive'); 
     SHFMT_CANCEL: ShowMessage('User canceled formatting the drive'); 
     SHFMT_NOFORMAT: ShowMessage('No Format') 
     else 
      ShowMessage('Disk has been formatted!'); 
    end; 
    except 
    ShowMessage('Error Occured!'); 
    end; 
end; 

Благодаря Дэвиду Хеффернану.

+0

Это в значительной степени повторяет то, что мой ответ говорит, но пропускает одну важную часть, а именно декларацию функции. –

+0

извините за это. сделано с помощью редактирования – Ago

+0

Это все еще было не так. Я починил это. –

Смежные вопросы