Трудно ответить на этот вопрос однозначно, поскольку вы не упомянули точную функцию API, которую хотите вызвать. Но в целом в Win32 API используются две модели управления памятью:
, вызывающая сторона выделяет буфер достаточного размера, а затем API заполняет буфер данными.
API распределяет и заполняет буфер данными, а затем возвращает их вызывающей стороне, которая затем должна их освободить.
Ответ Тома даетпример первого случая, поэтому я приведу пример второго случая.
В Delphi out ParamName: LPWSTR
означает, что параметр является ссылкой только для вывода на тип указателя. Это будет LPWSTR*
(wchar_t**
) в C и LPWSTR&
(wchar_t*&
) в C ++. И поскольку это ссылка на тип указателя, функция, вероятно, выделяет необходимую память и возвращает ее вызывающей стороне через ссылку, а затем ожидается, что вызывающая сторона впоследствии освободит ее.
Поскольку вы упомянули API файловой системыдавайте рассмотрим в качестве примера IShellItem.GetDisplayName()
API, который имеет такой параметр:
HRESULT GetDisplayName(
SIGDN sigdnName,
LPWSTR *ppszName
);
Параметры
sigdnName
Тип: SIGDN
Одно из значений SIGDN, указывающее, как должно выглядеть имя.
ppszName
Тип: LPWSTR *
Значение, которое при успешном возврате этой функции получает адрес указателя на найденное отображаемое имя.
...
Примечания
Ответственный за освобождениестрока, на которую указывает ppszName
, когда она больше не нужна. Вызовите CoTaskMemFree для *ppszName
, чтобы освободить память.
Итак, в 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 \».