При работе с API CreateVirtualDisk в операционной системе Windows 10 пользователи могут столкнуться с ошибкой 87, которая указывает на некорректный параметр. В данной статье мы рассмотрим причину возникновения этой ошибки и предложим решение, основанное на пересмотре и корректировке кода.
Проблема и контекст
Пользователи, пытающиеся создать виртуальный диск с помощью функции CreateVirtualDisk, сталкиваются с возвращаемым кодом ошибки 87. Это означает, что один из параметров функции передается неверно. Ошибка возникает на Windows 10 и не зависит от запуска программы от имени администратора.
Пример кода
program Project3;
{$APPTYPE CONSOLE}
uses
System.SysUtils,
Winapi.Windows;
type
// Типы и идентификаторы для виртуального хранения
VIRTUAL_STORAGE_TYPE = record
DeviceId: ULONG;
VendorId: TGUID;
end;
PVIRTUAL_STORAGE_TYPE = ^VIRTUAL_STORAGE_TYPE;
// ... (остальные типы и константы)
CREATE_VIRTUAL_DISK_VERSION = (CREATE_VIRTUAL_DISK_VERSION_UNSPECIFIED, CREATE_VIRTUAL_DISK_VERSION_1);
CREATE_VIRTUAL_DISK_PARAMETERS_V1 = record
Version: CREATE_VIRTUAL_DISK_VERSION;
UniqueId: TGUID;
MaximumSize: ULONGLONG;
BlockSizeInBytes: ULONG;
SectorSizeInBytes: ULONG;
ParentPath, SourcePath: PChar;
end;
PCREATE_VIRTUAL_DISK_PARAMETERS = ^CREATE_VIRTUAL_DISK_PARAMETERS_V1;
// ... (продолжение определений)
function CreateVirtualDisk(...): DWORD; stdcall; external 'VirtDisk.dll';
procedure CreateVhd(Path: UnicodeString; FileSizeBytes: Int64);
var
storageType: VIRTUAL_STORAGE_TYPE;
parameters: CREATE_VIRTUAL_DISK_PARAMETERS_V1;
vhdHandle: THandle;
res: DWORD;
begin
// Инициализация структур
storageType.DeviceId := VIRTUAL_STORAGE_TYPE_DEVICE_VHD;
storageType.VendorId := VIRTUAL_STORAGE_TYPE_VENDOR_MICROSOFT;
// ... (инициализация параметров)
{$MINENUMSIZE 4} // Установка минимального размера для перечислений
CREATE_VIRTUAL_DISK_FLAG = (
CREATE_VIRTUAL_DISK_FLAG_NONE = $00000000,
CREATE_VIRTUAL_DISK_FLAG_FULL_PHYSICAL_ALLOCATION = $00000001
);
// ... (продолжение инициализации)
res := CreateVirtualDisk(...);
// ... (обработка результата)
if res <> ERROR_SUCCESS then
begin
RaiseLastOSError(res);
Exit;
end;
// ... (закрытие дескриптора файла)
end;
begin
try
CreateVhd('C:\test.vhd', 15*1024*1024); // 15 MB
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
// ... (остальная часть программы)
end.
Подтвержденное решение
Причиной ошибки 87 является несоответствие размеров перечислений в коде и тех, что ожидает функция CreateVirtualDisk. В частности, перечисление CREATE_VIRTUAL_DISK_FLAG должно быть 4-байтовым, чтобы избежать несоответствия типов данных. Это можно установить с помощью директивы компилятора {$MINENUMSIZE 4}.
Также стоит обратить внимание на использование правильного маски доступа VIRTUAL_DISK_ACCESS_MASK. В зависимости от версии параметров CREATE_VIRTUAL_DISK_VERSION, может потребоваться использовать VIRTUAL_DISK_ACCESS_CREATE вместо VIRTUAL_DISK_ACCESS_NONE.
Альтернативный ответ
Помимо вышеупомянутого, важно убедиться, что путь к файлу виртуального диска не указывает на несуществующую или защищенную директорию. Если файл уже существует, его следует удалить перед созданием нового.
Заключение
При использовании API CreateVirtualDisk важно правильно настроить размеры перечислений и выбрать соответствующую маску доступа. Это обеспечит корректную работу функции и предотвратит возникновение ошибки 87.
Пользователи столкнулись с ошибкой 87 при использовании функции `CreateVirtualDisk` в Windows 10 из-за неверного размера перечислений в коде и некорректной маски доступа, что требует корректировки кода и проверки пути к файлу виртуального диска.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.