Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Решение ошибки 87 при использовании CreateVirtualDisk в Windows 10: минимальный пример кода на Delphi

Delphi , Синтаксис , Справочник по API-функциям

При работе с 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




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Справочник по API-функциям ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-01-13 19:17:02/0.0053949356079102/1