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)
也有效.