如何通过nil代替const记录?

Ian*_*oyd 7 windows delphi wic

我试图调用WIC(Windows Imaging Component)工厂方法CreateEncoder:

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

一般的想法是:

var
   encoder: IWICBitmapEncoder;

CreateEncoder(
      GUID_ContainerFormatIco,  //The GUID for the desired container format
      nil, //No preferred codec vendor
      {out}encoder);
Run Code Online (Sandbox Code Playgroud)

对于第二个参数,我想通过nil; 表示我没有编码器偏好

但是Delphi对WinCodec.pas的翻译是:

function CreateEncoder(const guidContainerFormat: TGuid; const pguidVendor: TGUID;
      out ppIEncoder: IWICBitmapEncoder): HRESULT; stdcall;          
Run Code Online (Sandbox Code Playgroud)

你会注意到第二个参数,即可 TGUID,被声明为const.

那我怎么把它传递给你呢?

我怎样才能通过需要记录的nil地方const

我尝试了天真的解决方案:

const
   NULL_GUID: TGUID = ();

factory.CreateEncoder(GUID_ContainerFormatIco, NULL_GUID, {out}encoder);
Run Code Online (Sandbox Code Playgroud)

虽然这不会失败,但它并没有真正遵循正确的规则.它传递的是非NULL地址,指向API不知道的GUID.

我尝试了天真的解决方案:

factory.CreateEncoder(GUID_ContainerFormatIco, TGUID(nil), {out}encoder);
Run Code Online (Sandbox Code Playgroud)

但这是一个无效的类型转换.

Gra*_*ter 10

你可以使用这样的东西:

const
  NULL_PGUID: PGUID = nil;
begin
  factory.CreateEncoder(GUID_ContainerFormatIco, NULL_PGUID^, {out}encoder);
end;
Run Code Online (Sandbox Code Playgroud)

或者正如Sertac建议的那样,更短更甜的版本:

factory.CreateEncoder(GUID_ContainerFormatIco, PGUID(nil)^, {out}encoder);
Run Code Online (Sandbox Code Playgroud)

我做了一个测试,David的建议是:

factory.CreateEncoder(GUID_ContainerFormatIco, TGUID(nil^), {out}encoder);    
Run Code Online (Sandbox Code Playgroud)

也有效.

  • 或PGuid(nil)^来保存变量 (5认同)