Cześc. Tak jak w temacie. Mam taki kod jak poniżej i on nie pokazuje w wynikowym pliku istniejącego folderu SYSNATIVE. Oraz MessageBox
z komunikatem "Mam go!" się nie ukaże. Przynajmnien u mnie. I to pomimo - jak widzicie - zastosowania - według mnie prawidłowo - funkcji Wow64DisableWow64FsRedirection oraz Wow64RevertWow64FsRedirection. Zgodnie z tym co piszą na MSDNie. Ale jednak DirectoryExists działa i wykrywa katalog. Kod testowany był pod Delphi 7 oraz na Windows 7 Ultimate 64 bit. Ma ktoś może pomysł jak to naprawić? Kombinowałem na różne sposoby, googlowałem i szukałem przykładów, według których takie rozwiąznie jak poniżej powinno działać. Ono jednak nie działa. Tylko jakoś 32 bitowy Total Commander znajduje ten niby "folder - przekierowanie" [?] w katalogu C:\WINDOWS
. Z góry dziękuję za wszelką pomoc od bardziej doświadczonych użytkowników 64 bitowych Windowsów. Dodam, że moduł redirfunc.pas
chyba z Inno Setup, który okroiłem, również mi nie pomógł. A potrzebuje uzyskiwać kompletną listę plików poniższą metodą z katalogu Windowsa. Ewentualne odpowiedzi, na które licze będę mógł przeczytać dopiero w poniedziałek po południu, także fajnie jakby ktoś (znowu @kAzek, a może @-123oho, a moze ktoś inny jeszcze? :)) dał radę mnie naprowadzić co robię nie tak.
program test;
{$APPTYPE CONSOLE}
uses
Windows, SysUtils;
type
TArrayOfString = array of string;
var
FilesArr : TArrayOfString;
var
Wow64Redirection : LongBool;
function DisableWowRedirection : boolean;
type
TWow64DisableWow64FsRedirection = function(var Wow64FsEnableRedirection : LongBool) : LongBool; stdcall;
var
HHandle : THandle;
Wow64DisableWow64FsRedirection : TWow64DisableWow64FsRedirection;
begin
Result := True;
try
HHandle := GetModuleHandle('kernel32.dll');
@Wow64DisableWow64FsRedirection := GetProcAddress(HHandle,
'Wow64DisableWow64FsRedirection');
if ((HHandle <> 0) and (@Wow64DisableWow64FsRedirection <> nil)) then
Wow64DisableWow64FsRedirection(Wow64Redirection);
except
Result := False;
end;
end;
function RevertWowRedirection : boolean;
type
TWow64RevertWow64FsRedirection = function(var Wow64RevertWow64FsRedirection : LongBool) : LongBool; stdcall;
var
HHandle : THandle;
Wow64RevertWow64FsRedirection : TWow64RevertWow64FsRedirection;
begin
Result := True;
try
HHandle := GetModuleHandle('kernel32.dll');
@Wow64RevertWow64FsRedirection := GetProcAddress(HHandle,
'Wow64RevertWow64FsRedirection');
if ((HHandle <> 0) and (@Wow64RevertWow64FsRedirection <> nil)) then
Wow64RevertWow64FsRedirection(Wow64Redirection);
except
Result := False;
end;
end;
function SaveTextToFile(AFileName : string; InStr : string) : boolean;
var
OutFile : THandle;
BytesWritten : DWORD;
OutFileSize : integer;
begin
OutFile := CreateFile(PChar(AFileName), GENERIC_WRITE,
FILE_SHARE_READ, nil, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
Result := OutFile <> INVALID_HANDLE_VALUE;
if Result then
begin
OutFileSize := Length(InStr);
WriteFile(OutFile, InStr[1], OutFileSize, BytesWritten, nil);
CloseHandle(OutFile);
end;
end;
procedure FileSearch(const PathName, FileName : string; var OutputArr : TArrayOfString);
var
X : integer;
H : THandle;
Path : string;
WFD : TWIN32FindData;
begin
Path := IncludeTrailingPathDelimiter(PathName);
DisableWowRedirection;
H := Windows.FindFirstFile(PChar(Path + FileName), WFD);
if H <> INVALID_HANDLE_VALUE then
begin
try
repeat
if (Copy(WFD.cFileName, 1, 1) <> '.') and (WFD.cFileName <> '..') then
begin
if AnsiUpperCase(WFD.cFileName) = 'SYSNATIVE' then
begin
MessageBox(0, 'Mam go!', 'Test', MB_OK);
end;
X := Length(OutputArr);
SetLength(OutputArr, X + 1);
OutputArr[X] := AnsiUpperCase(WFD.cFileName);
end;
until not FindNextFile(H, WFD);
RevertWowRedirection;
finally
Windows.FindClose(H);
end;
end;
end;
var
S : string;
I : integer;
begin
if DirectoryExists('C:\WINDOWS\SYSNATIVE\') then
begin
MessageBox(0, 'Jest!', 'Test', MB_OK);
end;
S := '';
SetLength(FilesArr, 0);
FileSearch('C:\WINDOWS\', '*', FilesArr);
for I := Low(FilesArr) to High(FilesArr) do
begin
if I < High(FilesArr) then
begin
S := S + FilesArr[I] + #13#10;
end
else
begin
S := S + FilesArr[I];
end;
end;
SaveTextToFile('D:\from_code.txt', S);
end.