Was mir grade spontan auffällt ist, dass du den Funktionsprototypen falsch nach Delphi portiert hast.
function FindNextFileNameW(Handle:Cardinal;var DatLänge:PDWORD;var LinkName:PWChar): Boolean;
sollte eher das hier sein:
function FindNextFileNameW(hFindStream: THandle; var StringLength: DWord; LinkName: PWChar): Boolean;
"var PDWord" und "var PWChar" ist doppelt. Nimm hier entweder einen var Parameter ODER einen Zeigerdatentyp
Edit 1: Hier mal mein Ansatz:
Delphi-Quellcode:
var
FindFirstFileNameW:
function(lpFileName: LPCWSTR; dwFlags: DWord;
var StringLength: DWord;
LinkName: PWChar): THandle;
stdcall;
FindNextFileNameW:
function(hFindStream: THandle;
var StringLength: DWord;
LinkName: PWChar): BOOL;
stdcall;
var
LinkName:
array[0..MAX_PATH - 1]
of WideChar;
StringLength: DWord;
hFindStream: THandle;
begin
@FindFirstFileNameW := GetProcAddress(LoadLibrary('
kernel32.dll'), '
FindFirstFileNameW');
@FindNextFileNameW := GetProcAddress(LoadLibrary('
kernel32.dll'), '
FindNextFileNameW');
if (
not Assigned(FindFirstFileNameW))
or (
not Assigned(FindNextFileNameW))
then
begin
raise Exception.Create('
Fehlermeldung');
end;
StringLength := MAX_PATH - 1;
hFindStream := FindFirstFileNameW('
D:\Bilder\Avatare\Mitch.png', 0, StringLength, @LinkName[0]);
if (hFindStream = INVALID_HANDLE_VALUE)
then RaiseLastOSError;
try
repeat
ShowMessage(StrPas(PWideChar(@LinkName[0])));
StringLength := MAX_PATH - 1;
until (
not FindNextFileNameW(hFindStream, StringLength, @LinkName[0]));
finally
Winapi.Windows.FindClose(hFindStream);
end;
end;
Edit 2:
INVALID_HANDLE_VALUE zu verwenden ist definitiv sicher. Dieser hohe Wert 429.. entspricht in Binärdarstellung einfach nur 4 Bytes, bei denen sämtliche Bits auf 1 gesetzt sind. Ob man die Zahl nun unsigned als 429.. darstellt, oder per DWord(-1) oder auch $FFFFFFFF ist im Grunde egal. Durch den Cast auf DWord, wird das höchste Bit nun einfach nicht mehr als Vorzeichen in Zweierkomplement-Darstellung interpretiert, sondern als zusätzliche 2er Potenz 2^31 aufaddiert.