gpt4 book ai didi

delphi - 提供缓冲区以接收Out LPWSTR值

转载 作者:行者123 更新时间:2023-12-02 23:04:50 25 4
gpt4 key购买 nike

我很少直接使用Windows API,但是我不可避免地会遇到这种情况,并且不确定如何处理它。

MS API文档指的是API调用的参数,例如

out Something LPWSTR


所以我显然必须提供一个缓冲区来接收它,但是我应该如何知道要提供多少缓冲区呢?我想我可以尝试在Something上调用StrLen,但这似乎意味着我需要调用API两次,一次是获取长度,第二次是实际检索结果,并且此期间长度可能有所变化。

OTOH,我可以预分配缓冲区(例如,作为本地WideChar数组),但这似乎不切实际,因为返回的字符串可以是任意长度(?)。

因此,我的q是如何正确接收Out LPWSTR的值? ANd,作为补充,我如何找到其编码(或者Win API是否始终使用相同的编码?如果是,使用哪种编码?)

我在问德尔福的Unicode后版本。

最佳答案

很难确切地回答这个问题,因为您没有提到要调用的确切API函数。但是通常,Win32 API中有两种用于内存管理的模型:


调用者分配一个足够大的缓冲区,然后API用数据填充该缓冲区。
API分配并用数据填充缓冲区,然后将其返回给调用方,然后调用方必须释放它。


汤姆的答案提供了第一种情况的示例,因此,我将提供第二种情况的示例。

在Delphi中,out ParamName: LPWSTR表示参数是对指针类型的仅输出引用。在C中为LPWSTR*wchar_t**),在C ++中为LPWSTR&wchar_t*&)。并且,由于它是对指针类型的引用,因此该函数可能会分配必要的内存,并通过该引用将其返回给调用方,然后,调用方将在之后释放它。

既然您提到了文件系统API,让我们以IShellItem.GetDisplayName() API为例,它具有这样的参数:


HRESULT GetDisplayName(
SIGDN sigdnName,
LPWSTR *ppszName
);


参量

sigdnName
类型:SIGDN
指示名称外观的SIGDN值之一。

ppszName
类型:LPWSTR *
当此函数成功返回时,该值将接收指向检索到的显示名称的指针的地址。

...

备注

当不再需要 ppszName指向的字符串时,调用者有责任释放它。在 *ppszName上调用CoTaskMemFree以释放内存。


因此,在Delphi中,可以用两种不同的方式之一声明和使用 GetDisplayName()方法:

type
IShellitem = interface
['{43826d1e-e718-42ee-bc55-a1e261c37bfe}']
...
function GetDisplayName(sigdnName: SIGDN, out ppszName: LPWSTR): HRESULT; stdcall;
...
end;

...

var
Item: IShellItem;
Path: PWideChar;
begin
// obtain Item as needed, then...
OleCheck(Item.GetDisplayName(SIGDN_FILESYSPATH, Path));
try
// use Path as needed...
finally
CoTaskMemFree(Path);
end;
end;


type
IShellitem = interface
['{43826d1e-e718-42ee-bc55-a1e261c37bfe}']
...
function GetDisplayName(sigdnName: SIGDN): LPWSTR; safecall;
...
end;

...

var
Item: IShellItem;
Path: PWideChar;
begin
// obtain Item as needed, then...
Path := Item.GetDisplayName(SIGDN_FILESYSPATH);
try
// use Path as needed...
finally
CoTaskMemFree(Path);
end;
end;


SHGetKnownFolderPath()是具有类似输出参数的文件系统API的另一个示例:


HRESULT SHGetKnownFolderPath(
REFKNOWNFOLDERID rfid,
DWORD dwFlags,
HANDLE hToken,
PWSTR *ppszPath
);


...

ppszPath
类型:PWSTR *
当此方法返回时,包含指向以空值结尾的Unicode字符串的指针的地址,该字符串指定已知文件夹的路径。一旦不再需要此资源,则调用过程负责通过调用CoTaskMemFree来释放该资源。返回的路径不包含尾部反斜杠。例如,返回“ C:\ Users”而不是“ C:\ Users \”。

关于delphi - 提供缓冲区以接收Out LPWSTR值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58628671/

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