AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

FindFirstFileNameW aufrufen

Ein Thema von Benmik · begonnen am 11. Jan 2014 · letzter Beitrag vom 13. Jan 2014
 
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#10

AW: FindFirstFileNameW aufrufen

  Alt 12. Jan 2014, 19:50
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.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)

Geändert von Zacherl (12. Jan 2014 um 20:09 Uhr)
  Mit Zitat antworten Zitat
 

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:00 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz