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

Как правильно передать `nil` в функцию `CreateEncoder` из WIC в Delphi

Delphi , ОС и Железо , Windows

Как правильно передать nil в функцию CreateEncoder из WIC в Delphi

При работе с Windows Imaging Component (WIC) в среде разработки Delphi, иногда возникает необходимость передать в функцию nil в качестве параметра, когда нет предпочтений по кодеку. В документации WIC функция CreateEncoder описывается следующим образом:

HRESULT CreateEncoder(
  [in]            REFGUID guidContainerFormat,
  [in, optional]  const GUID *pguidVendor,
  [out, retval]   IWICBitmapEncoder **ppIEncoder
);

Параметр pguidVendor является необязательным и предназначен для указания предпочтительного поставщика кодека. В случае, если предпочтений нет, необходимо передать nil.

В Delphi, перевод функции CreateEncoder выглядит так:

function CreateEncoder(const guidContainerFormat: TGuid; const pguidVendor: TGUID;
                      out ppIEncoder: IWICBitmapEncoder): HRESULT; stdcall;

Параметр pguidVendor объявлен как const TGUID, что может вызвать затруднения при попытке передать nil.

Попытка простого определения NULL_GUID как пустого массива:

const
  NULL_GUID: TGUID = (); // Неправильно, так как это не `nil`

factory.CreateEncoder(GUID_ContainerFormatIco, NULL_GUID, {out}encoder);

Не является корректным решением, так как передаётся не nil, а адрес, указывающий на неизвестный API объект.

Альтернативный подход, попытка привести nil к типу TGUID, также не удаётся:

factory.CreateEncoder(GUID_ContainerFormatIco, TGUID(nil), {out}encoder); // Невалидное преобразование типов

Подтвержденный ответ заключается в использовании указателя на TGUID. Можно определить константу NULL_PGUID как nil и передать в функцию:

const
  NULL_PGUID: PGUID = nil;

begin
  factory.CreateEncoder(GUID_ContainerFormatIco, NULL_PGUID^, {out}encoder);
end;

Также возможно использование более краткой записи, предложенной Sertac:

factory.CreateEncoder(GUID_ContainerFormatIco, PGUID(nil)^, {out}encoder);

И предложение Davida, которое также прошло тестирование:

factory.CreateEncoder(GUID_ContainerFormatIco, TGUID(nil^), {out}encoder);

Таким образом, правильно передать nil в функцию CreateEncoder можно, используя указатель на TGUID, инициализированный значением nil. Это позволит корректно указать, что предпочтений по кодеку нет.

Создано по материалам из источника по ссылке.

Контекст вопроса заключается в том, как корректно передать значение `nil` в качестве параметра функции `CreateEncoder` из библиотеки Windows Imaging Component (WIC) при работе в среде разработки Delphi.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




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


:: Главная :: Windows ::


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-05-01 12:04:39/0.0034720897674561/0