04.05.2018, 14:02
|
|
I Like it!
|
|
Регистрация: 12.12.2009
Адрес: Россия, г. Новосибирск
Сообщения: 660
Версия Delphi: D6/D7
Репутация: 26643
|
|
Код:
function TForm1.ProcessDirectoryNode(const aNode: TTreeNode; const TreeView: TTreeView; const NodeList: TNodeList): cardinal;
var
tWDF: WIN32_FIND_DATAW;
h: Cardinal;
wSearchName: PWideChar; // <--------
searchName: PChar;
foundName: array[0..MAX_PATH - 1] of Char;
NewNode: TTreeNode;
Path: string;
res_len: Integer;
begin
Result := 0;
if (aNode = nil) or (NodeList = nil) then
Exit;
Path := aNode.Text;
searchName := PChar(Path + '\*.*');
res_len := MultiByteToWideChar(CP_UTF8, 0, searchName, Length(searchName), nil, 0); // <-------- Определяем длину выходного буфера
h := INVALID_HANDLE_VALUE;
if res_len > 0 then
begin
wSearchName := GetMemory(res_len * SizeOf(WideChar) + 2); // <-------- выделяем память под выходной буфер
try
FillMemory(wSearchName, res_len, 0); // <-------- очищаем выходной буфер
res_len := MultiByteToWideChar(CP_UTF8, 0, searchName, Length(searchName), wSearchName, res_len); // <-------- конвертируем
if res_len = 0 then
RaiseLastOSError
else
h := FindFirstFileW(wSearchName, tWDF);
finally
FreeMemory(wSearchName); // <-------- не забываем подчистить за собой
end;
end;
WideCharToMultiByte(CP_UTF8, 0, tWDF.cFileName, MAX_PATH, foundName, MAX_PATH, nil, nil);
with tWDF do
begin
Application.ProcessMessages;
if h = INVALID_HANDLE_VALUE then
....
Win7, D7 отрабатывает без ошибок и почти моментально на забитом C:\
__________________
Грамотно поставленный вопрос содержит не менее 50% ответа.
Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть.
|