作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我很少直接使用Windows API,但是我不可避免地会遇到这种情况,并且不确定如何处理它。
MS API文档指的是API调用的参数,例如
out Something LPWSTR
最佳答案
很难确切地回答这个问题,因为您没有提到要调用的确切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
ppszName
ppszName
指向的字符串时,调用者有责任释放它。在
*ppszName
上调用CoTaskMemFree以释放内存。
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
关于delphi - 提供缓冲区以接收Out LPWSTR值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58628671/
我是一名优秀的程序员,十分优秀!