Entwickler-Ecke

Windows API - Filename aus Filehandle


Boldar - So 28.12.08 23:31
Titel: Filename aus Filehandle
Hmm ich habe da ein komplexes Problem,
und ich hoffe ich nerve nicht, weil ich schon soviel gefragt habe in letzter Zeit...
Wie kriegt man den Dateinamen und -pfad aus einem filehandle?
ich habe schon das hier [http://msdn.microsoft.com/en-us/library/aa366789.aspx] gefunden, kann man das auf Delphi portieren?
Geht das?
mfg Boldar


jaenicke - So 28.12.08 23:37

Schau mal hier, das geht mit GetFileInformationByHandleEx (FileNameInfo): ;-)
http://msdn.microsoft.com/en-us/library/aa364953(VS.85).aspx

// EDIT:
Ich sehe schon: das geht so einfach erst ab Vista.
Dann ist vorher wohl das was du im Edit gepostet hast das passende. Übersetzen geht sicher.


Boldar - So 28.12.08 23:40

mmh wie verwendet man das denn?
Was ist denn das [http://msdn.microsoft.com/en-us/library/aa364228(VS.85).aspx] für eine Konstruktion??

Aso, erst ab Vista... mhh
Also ich kann ja absolut kein C... :flehan: :nixweiss: :nixweiss:


jaenicke - So 28.12.08 23:44

Das ist eine Aufzählung, in Delphi also sowas:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
type
  TExample = (exaName1, exaName2, exaName3);
...
var
  test: TExample;
begin
  test := exaName2;
  case test of
    exaName1: ...
    exaName2: ...


Boldar - So 28.12.08 23:48

Wenn da diese Zeile steht:

Quelltext
1:
BOOL GetFileNameFromHandle(HANDLE hFile)                    


was ist dann BOOL ?
Einfach boolean oder longbool??


jaenicke - So 28.12.08 23:55

Nimm doch einfach Bool ;-). Das gibts durchaus und verweist intern auf den richtigen Datentyp (LongBool), um Übersetzungen zu erleichtern ;-).


Boldar - Mo 29.12.08 11:52

OK, ich habe jetzt versucht das zu übersetzen, aber was ist
lptstring?
das Scheint es in Delphi nicht zu geben...
Das ist aus der Funktion hier:
http://msdn.microsoft.com/en-us/library/ms683195(VS.85).aspx


Boldar - Mo 29.12.08 12:03

ist Tchar ein Pointertyp? Ich habe lptstring mit pointer übersetzt, aber dann müsst Tchar auch ein pointer sein...


Boldar - Mo 29.12.08 12:07

Aso und gleich noc eine Frage dazu: ich habe die Ausdrücke, die in C integer waren, nach boolean gecastet. Ist das richtig?


jaenicke - Mo 29.12.08 12:07

Übersetzen würde ich das mit array[0..MAX_PATH] of Char. ;-)

Ich hatte bisher nur in die API Referenz kurz geschaut, aber jetzt hab ich grad mal bei Google gesucht :D, die Frage gabs schon: :D
http://www.delphipraxis.net/topic123965.html


Boldar - Mo 29.12.08 12:08

ja, das habe ich zuerst versucht, gab aber einen fürchterlichen rash und das ganze ist sehr unübersichtlich...


jaenicke - Mo 29.12.08 12:09

Und hier gehts um das selbe, da wird das auch so verwendet der Typ sehe ich gerade:
http://www.spotlight-wissen.de/archiv/message/1376764.html


Boldar - Mo 29.12.08 12:09

Also, und wie übersetz man das:

Quelltext
1:
TCHAR szDrive[3] = TEXT(" :");                    


Was heisst denn das TEXT?? :?: :gruebel: :gruebel:

Ahh Ok das scheint zu klappen...


jaenicke - Mo 29.12.08 12:15

Ich glaube du kannst einen String auf PChar gecastet an die Funktion übergeben mit dem Inhalt C: z.B., im C-Quelltext wird der erste Buchstabe durch den jeweiligen Laufwerksbuchstaben ersetzt vor der Übergabe, deshalb das Leerzeichen.


Boldar - Mo 29.12.08 12:21

also, ich habs jetzt erstmal übernommen von da [http://www.spotlight-wissen.de/archiv/message/1376764.html]
Nur weiss ich nicht wie ich getmappedfilename vernünftig hinkriege, laut msdn inner psapi.dll,
aber bei dieser Deklaration

Delphi-Quelltext
1:
function GetMappedFileName( const hProcess: Thandle;const lpv: pointer;var lpFilename: array of char;const nsize: Dword):dword; winapi;external 'psapi.dll';                    


kommt der Fehler von wegen Prozedureinspungpunkt nicht gefunden...


jaenicke - Mo 29.12.08 12:47

Nimm doch einfach die fertigen Übersetzungen aus der JEDI Übersetzung ;-).
http://jedi-apilib.sourceforge.net/
--> JEDI API Windows Headers (JWAPI) --> JwaPsApi
Da ist die PsApi schon übersetzt. ;-)


Boldar - Mo 29.12.08 12:48

mmh und wie schauts da mit der Lizenz aus?


jaenicke - Mo 29.12.08 12:52

Steht doch da... :roll:
Mozilla Public License Version 1.1 [http://www.mozilla.org/MPL/MPL-1.1.html]
http://de.wikipedia.org/wiki/Mozilla_Public_License


Boldar - Mo 29.12.08 12:54

mmh aber was heisst das denn jetzt konkret? in dem Wikipedia Artikel steht sehr viel fachchinesich...
Könnte man z.B. den Code in Kommerziellen Projekten verwenden?


jaenicke - Mo 29.12.08 13:09

Ja, steht in der Lizenz ja, du musst nur die Bedingungen beachten. Z.B. müssen die Dateien unter der MPL auch als ganzes weiterhin darunter stehen, wenn du sie veränderst oder kopierst. Wenn du eine Unit unter der MPL einbindest, dann muss der Rest nicht unter die MPL, wenn du MPL-lizenzierten Code in eine Unit kopierst oder solchen Code veränderst, dann musst du die gesamte Unit unter die MPL stellen (und den Quelltext veröffentlichen).

Im Unterschied zur LGPL (u.a.) muss der MPL Code nicht eigenständig kompilierbar sein, es reicht die Abtrennung in abgeschlossene Dateien (Units).


Boldar - Mo 29.12.08 15:35

mmh also die Funktion ergibt bei mir immer komische Zeichen als ergebnis...


jaenicke - Mo 29.12.08 16:13

Ich sehs, CreateFileMapping schlägt fehl wie man sieht, jedenfalls beim Test eben. Ich weiß nicht warum, mal schauen. :nixweiss:


Boldar - Mo 29.12.08 16:15

mmh also bei mir scheints sporadisch manchmal zu gehen und manchmal nicht...
ich hasse Heisenbugs!!!!


jaenicke - Mo 29.12.08 16:25

Prüf jeweils ob das Handle überhaupt gültig ist. Bei mir hat gleich CreateFileMapping 0 zurückgegeben, aber das wurde nicht geprüft. Die "komischen Zeichen" waren der uninitialisierte Inhalt des Buffers.


Boldar - Mo 29.12.08 16:26

und wie prüft man auf ein gültiges Handle? indem man dann das ergebnis createfilemapping auswertet oder schon früher?


jaenicke - Mo 29.12.08 16:30

Wenn ein Handle 0 ist, ist es nicht gültig. Weder das deiner Datei noch die Rückgabewerte von z.B. CreateFileMapping sollten 0 sein.


Boldar - Mo 29.12.08 16:31

mmh jetzt gehts, aber dafür hab ich ein anderes Problem...