Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 如何通过零来代替常量记录?_Windows_Delphi_Wic - Fatal编程技术网

Windows 如何通过零来代替常量记录?

Windows 如何通过零来代替常量记录?,windows,delphi,wic,Windows,Delphi,Wic,我正在尝试调用WIC(Windows图像组件)工厂方法CreateEncoder: HRESULT CreateEncoder( [in] REFGUID guidContainerFormat, [in, optional] const GUID *pguidVendor, [out, retval] IWICBitmapEncoder **ppIEncoder ); 总的想法是: var encoder: IWICBitmapEncoder;

我正在尝试调用WIC(Windows图像组件)工厂方法
CreateEncoder

HRESULT CreateEncoder(
  [in]            REFGUID guidContainerFormat,
  [in, optional]  const GUID *pguidVendor,
  [out, retval]   IWICBitmapEncoder **ppIEncoder
);
总的想法是:

var
   encoder: IWICBitmapEncoder;

CreateEncoder(
      GUID_ContainerFormatIco,  //The GUID for the desired container format
      nil, //No preferred codec vendor
      {out}encoder);
对于第二个参数,我想传递
nil
;表示我没有编码器首选项

但德尔福对WinCodec.pas的翻译是:

function CreateEncoder(const guidContainerFormat: TGuid; const pguidVendor: TGUID;
      out ppIEncoder: IWICBitmapEncoder): HRESULT; stdcall;          
您会注意到第二个参数,可选的
TGUID
,被声明为
const

那么,我如何通过零呢? 如果需要
const
记录,如何传递
nil

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

const
   NULL_GUID: TGUID = ();

factory.CreateEncoder(GUID_ContainerFormatIco, NULL_GUID, {out}encoder);
factory.CreateEncoder(GUID_ContainerFormatIco, TGUID(nil), {out}encoder);
虽然这碰巧没有失败,但它并没有真正遵循正确的规则。它传递一个非空地址,该地址指向API不知道的GUID

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

const
   NULL_GUID: TGUID = ();

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

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

您可以使用如下内容:

const
  NULL_PGUID: PGUID = nil;
begin
  factory.CreateEncoder(GUID_ContainerFormatIco, NULL_PGUID^, {out}encoder);
end;
或者正如Sertac所建议的,更短更甜的版本:

factory.CreateEncoder(GUID_ContainerFormatIco, PGUID(nil)^, {out}encoder);
我做了一个测试,大卫建议:

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

同样有效。

或PGuid(nil)^要保存一个变量,这些比我处理的
TGUID(PGuid(nil)^)
要好得多!伊恩,你的
TGUID(PGUID(nil)^
是一次很好的尝试!您可以省略该
TGUID
typecast,因为
PGUID()^
已经取消引用了
TGUID
的值,因此typecast在那里是无用的
PGUID(nil)^
可以理解为您正在解引用指向
nil
指针常量的
TGUID
指针
TGUID(nil^)
因为您正在解引用
nil
指针常量,并且您键入的值转换为
TGUID
类型。
TGUID(nil^)
也可能work@DavidHeffernan:+1这通常是人们开始对你感到奇怪的时候。BTDT。