gpt4 book ai didi

delphi - 如何正确调用 SHGetImageList?可以用它检索 HIMAGELIST 吗?

转载 作者:行者123 更新时间:2023-12-02 01:58:18 28 4
gpt4 key购买 nike

我试图检查shell的共享镜像列表,遵循看似简单(但实际上不是很清楚)PSDK documentation包括我可以在 HIMAGELISTIImageList 类型之间自由转换的注释(我后来发现可疑的第一件事)。因此,我编写了以下代码:

procedure TForm1.FormCreate(Sender: TObject);
const
IID_IImageList: TGUID = '{46EB5926-582E-4017-9FDF-E8998DAA0950}';
IID_IImageList2: TGUID = '{192B9D83-50FC-457B-90A0-2B82A8B5DAE1}';
var
himl: HIMAGELIST;
begin
CoInitialize(nil);

OleCheck(SHGetImageList(SHIL_LARGE, IID_IImageList, Pointer(himl)));
ImageList1.Handle := himl;
end;

但它的工作效果非常差:API 调用返回 HRESULT_FROM_WIN32(ERROR_INVALID_PARAMETER),然后因多次访问冲突而崩溃,这表明应用程序和库之间存在一些二进制不一致的情况。然而,我使用的函数的库存 Delphi 导入看起来是正确的:

function SHGetImageList(iImageList: Integer; const riid: TGUID; 
var ppvObj: Pointer): HResult;
function SHGetImageList; external shell32 name 'SHGetImageList' delayed;

我在文档中发现的第二个令人困惑的是riid参数描述仅列出了一个可能的值 - IID_IImageList这可能与我检索句柄类型的意图不符。

那么,如何正确调用 SHGetImageList 呢?是否可以用它检索 HIMAGELIST

最佳答案

问题在于 Delphi 在 ShellAPI 单元中的库存声明。它缺少 stdcall 调用约定。要解决这个问题,您可以在自己的代码中手动声明该函数:

function SHGetImageList(iImageList: Integer; const riid: TGUID;
var ppvObj: Pointer): HResult; stdcall; external shell32;

procedure TTestForm.Button1Click(Sender: TObject);
const
IID_IImageList: TGUID = '{46EB5926-582E-4017-9FDF-E8998DAA0950}';
var
himl: HIMAGELIST;
begin
//CoInitialize(nil);
OleCheck(SHGetImageList(SHIL_LARGE, IID_IImageList, Pointer(himl)));
ImageList1.Handle := himl;
end;

注意:如果您不删除项目源中的 Application.Initialize 调用,VCL 应用程序已调用 CoInitialize

关于delphi - 如何正确调用 SHGetImageList?可以用它检索 HIMAGELIST 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37631731/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com