AGB  ·  Datenschutz  ·  Impressum  







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

Dateiname aus Dateihandle ermitteln

Ein Thema von Luckie · begonnen am 3. Sep 2008 · letzter Beitrag vom 3. Sep 2008
 
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#1

Dateiname aus Dateihandle ermitteln

  Alt 3. Sep 2008, 12:01
Ich habe hier folgende Funktion, um zu einem Dateihandle den dateinamen zu ermitteln:
Delphi-Quellcode:
type
  PIO_STATUS_BLOCK = ^IO_STATUS_BLOCK;
  IO_STATUS_BLOCK = packed record
    Status: NTSTATUS;
    Information: DWORD;
  end;
  TIOStatusBlock = IO_STATUS_BLOCK;

  PFILE_NAME_INFORMATION = ^FILE_NAME_INFORMATION;
  FILE_NAME_INFORMATION = packed record
    FileNameLength: ULONG;
    FileName: array[0..MAX_PATH - 1] of WideChar;
  end;
  TFileNameInformation = FILE_NAME_INFORMATION;

  PUNICODE_STRING = ^TUNICODE_STRING;
  TUNICODE_STRING = packed record
    Length: WORD;
    MaximumLength: WORD;
    Buffer: array[0..MAX_PATH - 1] of WideChar;
  end;

  POBJECT_NAME_INFORMATION = ^OBJECT_NAME_INFORMATION;
  OBJECT_NAME_INFORMATION = packed record
    Name: TUNICODE_STRING;
  end;
  TObjectNameInformation = OBJECT_NAME_INFORMATION;

var
  NtQueryInformationFile: function(FileHandle: THandle;
    IoStatusBlock: PIO_STATUS_BLOCK;
    FileInformation: Pointer;
    Length: DWORD; FileInformationClass: DWORD): NTStatus; stdcall = nil;

  NtQueryObject : function(ObjectHandle: THandle;
    ObjectInformationClass: DWORD; ObjectInformation: Pointer;
    ObjectInformationLength: ULONG;
    ReturnLength: PDWORD): NTStatus; stdcall = nil;

function GetFileNameByHandle(FileHandle: THandle): string;
var
  FileNameInfo : TFileNameInformation;
  ObjectNameInfo : TObjectNameInformation;
  IoStatusBlock : TIOStatusBlock;
  res, dwReturn : DWORD;
begin
  result := '';
  Writeln(FileHandle);
  res := NtQueryInformationFile(FileHandle, @IoStatusBlock, @FileNameInfo,
    SizeOf(FileNameInfo.FileName), FileNameInformation);
  if res = STATUS_SUCCESS then
  begin
    res := NtQueryObject(FileHandle, ObjectNameInformation,
      @ObjectNameInfo, SizeOf(ObjectNameInfo.Name.Buffer), @dwReturn);
    if res = STATUS_SUCCESS then
    begin
      SetLength(result, MAX_PATH);
      SetLength(result, WideCharToMultiByte(CP_ACP, 0,
        @ObjectNameInfo.Name.Buffer[ObjectNameInfo.Name.MaximumLength -
        ObjectNameInfo.Name.Length],
          ObjectNameInfo.Name.Length div SizeOf(WideChar),
        @result[1], MAX_PATH, nil, nil));
    end
    else
    begin
      SetLength(result, MAX_PATH);
      SetLength(result, WideCharToMultiByte(CP_ACP, 0,
        @FileNameInfo.FileName[0], FileNameInfo.FileNameLength div
        SizeOf(WideChar), @result[1], MAX_PATH, nil, nil));
    end;
  end;
end;
Ich habe eine Liste von Dateihandle, die ich durchgehe und die obige Funktion für jedes Handle aufrufe. Jetzt ist es allerdings so, dass der Code stecken bleibt, wenn ich obigen Code verwende. Das heißt, er arbeitet die Liste nicht mehr ab und hört mitten drin auf. Kommentiere ich den Aufruf der Funktion aus, geht er die ganze Liste bis zum Ende durch.
Was ist an der Funktion falsch, dass er dort "hängenbleibt"?
Michael
Ein Teil meines Codes würde euch verunsichern.
  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 19:29 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