Einzelnen Beitrag anzeigen

Benmik

Registriert seit: 11. Apr 2009
486 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: FindFirstFileNameW aufrufen

  Alt 11. Jan 2014, 21:41
So, nachdem ich wirklich heißgelaufen bin über vermutlich triviale Probleme, hier das (funktionierende) Resultat:
Delphi-Quellcode:
function FindNextFileNameW(Handle:Cardinal;var DatLänge:PDWORD;var LinkName:PWChar): Boolean;
type
  TFindNextFileNameW = function(Handle:Cardinal;var DatLänge:PDWORD;var LinkName:PWChar): Boolean; stdcall;
var
  kernel32: HModule;
  _TFindNextFileNameW: TFindNextFileNameW;
begin
  kernel32 := GetModuleHandle('kernel32');
  @_TFindNextFileNameW := GetProcAddress(kernel32, 'FindNextFileNameW');
  Result := _TFindNextFileNameW(Handle,DatLänge,LinkName);
end;

function FindFirstFileNameW(Dateiname:PWideChar;Marker:Cardinal;var DatLänge:PDWORD;var LinkName:PWChar): Cardinal;
type
  TFindFirstFileNameW = function(Dateiname:PWideChar;Marker:Cardinal;var DatLänge:PDWORD;var LinkName:PWChar): Cardinal; stdcall;
var
  kernel32: HModule;
  _TFindFirstFileNameW: TFindFirstFileNameW;
begin
  kernel32 := GetModuleHandle('kernel32');
  @_TFindFirstFileNameW := GetProcAddress(kernel32, 'FindFirstFileNameW');
  Result := _TFindFirstFileNameW(Dateiname,0,DatLänge,LinkName);
end;

function CloseHFile(Handle:Cardinal): Boolean;
type
  TCloseHFile = function(Handle:Cardinal): Boolean; stdcall;
var
  kernel32: HModule;
  _TCloseHFile: TCloseHFile;
begin
  kernel32 := GetModuleHandle('kernel32');
  @_TCloseHFile := GetProcAddress(kernel32, 'FindClose');
  Result := _TCloseHFile(Handle);
end;

procedure TForm1.ZeigeHardlinks;
var
  Dateiname : WideString;
  DatLänge : Cardinal;
  PDatLänge : PDWORD;
  LinkName : WideChar;
  PLinkName : PWideChar;
  Handle : Cardinal;
begin
  Dateiname := 'C:\Temp\Hardlink.JPG';
  PLinkName := @LinkName;
  PDatLänge := @DatLänge;
  Handle := FindFirstFileNameW(PWideChar(Dateiname),0,PDatLänge,PLinkName);
  If Handle = 4294967295
    then Showmessage(SysErrorMessage(GetLastError));
  Showmessage(WideCharToString(@PLinkName));
  While FindNextFileNameW(Handle,PDatLänge,PLinkName) do
    Showmessage(WideCharToString(@PLinkName));
  CloseHFile(Handle);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ZeigeHardlinks;
end;
Da ich schon mal dabei war, habe ich für CloseFile auch gleich die entsprechende Funktion aus kernel32.dll aufgerufen, da es ja in Delphi für FindFirstFileNameW nichts gibt.

Eine Sache ist merkwürdig und ärgerlich: Mit Verlassen der Routine '"ZeigeHardlinks" kommt es zu einer Zugriffsverletzung im Modul "oleaut32.dll" (Lesen). Hat da jemand eine Idee zu?

Geändert von Benmik (11. Jan 2014 um 21:56 Uhr) Grund: FindNextFileNameW hinzugefügt
  Mit Zitat antworten Zitat