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
Antwort Antwort
Benmik

Registriert seit: 11. Apr 2009
570 Beiträge
 
Delphi 12 Athens
 
#1

FindFirstFileNameW aufrufen

  Alt 11. Jan 2014, 15:43
Für ein geplantes selbst gestricktes Backup-Programm möchte ich gern bei Hardlinks feststellen, welche Dateinamen alle auf den gleichen Speicherbereich ("Datei") zeigen. Nach viel Recherche bin ich darauf gekommen, dass hier FindFirstFileNameW und FindNextFileNameW genau das Richtige sind.
Die Windows-API definiert FindFirstFileNameW(_In_ LPCWSTR lpFileName,_In_ DWORD dwFlags,_Inout_ LPDWORD StringLength,_Inout_ PWCHAR LinkName) und FindNextFileNameW(_In_ HANDLE hFindStream,_Inout_ LPDWORD StringLength,_Inout_ PWCHAR LinkName).
Trotz des Anspruchs, dass Delphi die gesamte Windows-API kapselt, habe ich nichts dergleichen gefunden.
Erstaunlicherweise ergibt die Google-Suchen nach den Funktionen im Zusammenhang mit Delphi NIX, GAR NIX !
Ich müsste also die Funktionen dynamisch aus kernel32 laden.
Hierzu habe ich für GetTickCount64 ein Beispiel gefunden:
Delphi-Quellcode:
function GetTickCount64: Int64;

implementation

uses Windows, SysUtils;

type
   // Don't forget stdcall for API functions.
  TGetTickCount64 = function: Int64; stdcall;

var
  _GetTickCount64: TGetTickCount64;

// Load the Vista function if available, and call it.
// Raise EOSError if the function isn't available.
function GetTickCount64: Int64;
var
  kernel32: HModule;
begin
  if not Assigned(_GetTickCount64) then begin
    // Kernel32 is always loaded already, so use GetModuleHandle
    // instead of LoadLibrary
    kernel32 := GetModuleHandle('kernel32');
    if kernel32 = 0 then
      RaiseLastOSError;
    @_GetTickCount := GetProcAddress(kernel32, 'GetTickCount64');
    if not Assigned(_GetTickCount64) then
      RaiseLastOSError;
  end;
  Result := _GetTickCount64;
end;
Weiß einer von den Delphi-Cracks hier vielleicht, wie die beiden Funktionen aufzurufen wären?
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: FindFirstFileNameW aufrufen

  Alt 11. Jan 2014, 16:02
AFAIK wird mit Delphi-Referenz durchsuchenSysUtils.FindFirst Delphi-Referenz durchsuchenSysUtils.FindNext genau das gekapselt.
Das Ergebnis findest du im Delphi-Referenz durchsuchenSysUtils.TSearchRec
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.336 Beiträge
 
Delphi 12 Athens
 
#3

AW: FindFirstFileNameW aufrufen

  Alt 11. Jan 2014, 16:05
Delphi-Referenz durchsuchenFindFirst kapselt MSDN-Library durchsuchenFindNextFile (FindNextFileA und ab D2009 FindNextFileW),
aber hier geht es um MSDN-Library durchsuchenFindNextFileNameW.

Das geht genauso, wie im Beisiel:
- Funktions-Typ deklarieren (entsprechend wie TGetTickCount64 die API-Deklaration übersetzen)
- über MSDN-Library durchsuchenLoadLibrary die DLL laden, oder via MSDN-Library durchsuchenGetModuleHandle das Handle holen, wenn die DLL definitiv schon geladen ist
- den Prozedur-Einsprungpunkt holen (MSDN-Library durchsuchenGetProcAddress) und der Variable des Funktionstyps zuweisen
(und dafür gibt es eigentlich millionen Beispiele und Tutorials zu finden, wie man eine API/WinAPI einbindet, auch wenn es kaum welcher für gerade diese API gibt, aber das Grundprinzip bleibt ja gleich)

Wenn du die Funktion unbedingt brauchst und das Programm ohne nicht geht, dann kann man die Funktion auch statisch einbinden ... siehe z.B. die Unit Windows, wo statische und dynamische Beispiele drin sind.


In deinem Beispiel wird die Funktion jedesmal bei jedem Aufruf geprüft und wenn noch nicht geladen, dann wird das erstmal gemacht, vor dem Aufruf.
Man kann die Funktions-Variable aber auch schon beim Programmstart (in einer eigenen Init-Prozedur, welche man aufruft) oder in Initialization laden.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (11. Jan 2014 um 16:15 Uhr)
  Mit Zitat antworten Zitat
Benmik

Registriert seit: 11. Apr 2009
570 Beiträge
 
Delphi 12 Athens
 
#4

AW: FindFirstFileNameW aufrufen

  Alt 11. Jan 2014, 17:18
Vielen Dank!

Insgeheim hatte ich natürlich gehofft, einer von euch Könnern würde mal lässig was aus dem Handgelenk hier hin werfen, aber naja, Weihnachten ist vorbei, und hier wird ja viel Wert auf Eigenanstrengung gelegt ...
Ehrlich gesagt ist es nicht so sehr die Anpassung des Beispiels, die mir, glaube ich, nicht soviel Probleme bereiten würde, als vielmehr die Übersetzung der Datentypen, da ich von C++ keine Ahnung habe. Was für ein Datentyp ist zum Beispiel "hFindStream"? Ein Handle, also Cardinal?

Aber da habe ich doch diese nette Seite gefunden, die mir vermutlich weiterhelfen wird. Das Konzept der Eigenanstrengung scheint also nicht verkehrt zu sein (wenn mir auch Weihnachten lieber ist...)
  Mit Zitat antworten Zitat
Benmik

Registriert seit: 11. Apr 2009
570 Beiträge
 
Delphi 12 Athens
 
#5

AW: FindFirstFileNameW aufrufen

  Alt 11. Jan 2014, 20:41
Wie vermutet sind es die Datentypen, insbesondere die Pointer, bei denen ich nicht weiterkomme.

Könnte mir vielleicht doch jemand helfen, wie ich mit Typumwandlungen, der eventuellen Initialisierung und dem Aufruf von LPCWSTR, LPDWORD und PWCHAR verfahren muss? Die Funktion selber scheint zu klappen, aber der Rückgabewert von "LinkName" ist Müll.
Ich habe Linkname als PWideChar deklariert und mit GetMem(LinkName, 256 * SizeOf(WideChar)) initialisiert, StringLength als LPDWORD mit GetMem(PDatLänge, SizeOf(DWORD)). Aber das funktioniert nicht und beim Beenden gibt es trotz FreeMem eine Schutzverletzung.
Vielleicht könnte mir doch jemand unter die Arme greifen.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.336 Beiträge
 
Delphi 12 Athens
 
#6

AW: FindFirstFileNameW aufrufen

  Alt 11. Jan 2014, 21:13
Bei PChars wird oftmals nur der Inhalt überschrieben und nicht der Variablenzeiger.

Den Speicher für die Variable mußt du vorher reservieren.

GetMemory, SetLength oder sonswie, jenachdem was für einen Speicher du nimmst.

z.B. kann man sich einen WideString oder UnicodeString nehmen, da via SetLength ausreichend Speicher/Zeichen reservieren und das dann via PWideChar gegastet an die Funktion übergeben, welche dann den Text dort reinschreibt.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Antwort Antwort

 

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 08:44 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