Announcement

Collapse
No announcement yet.

ReadDirectoryChangesW

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • ReadDirectoryChangesW

    Hallo!

    Ich versuche für einen Aufruf von ReadDirectoryChangesW mit CreateFile
    ein Handle auf das Verzeichnis zu bekommen. Dazu muß man CreateFile mit
    dem Parameter FILE_LIST_DIRECTORY aufrufen, nur leider kennt der Delphi-
    Compiler diese Konstante nicht. Kann mir vielleicht jemand den numerischen
    Wert sagen oder mir einen Tip geben, wie man sonst da rankommen kann?
    Danke schon mal...

    Daemor

  • #2
    Hallo,

    im Win32-SDK findet sich die Deklaration dieser Konstante in der Datei <b>WinNT.h</b>:

    #define FILE_LIST_DIRECTORY ( 0x0001 ) // director

    Comment


    • #3
      Vielen Dank erstmal!

      Jetzt habe ich aber schon wieder ein Problem:

      Beim Aufruf dieser Prozedur:

      procedure TForm1.Button3Click(Sender: TObject);
      var
      hDir: THandle;
      begin
      hDir:= CreateFile('g:\temp',
      $0001,//FILE_LIST_DIRECTORY
      FILE_SHARE_READ or FILE_SHARE_DELETE,
      nil,
      OPEN_EXISTING,
      FILE_FLAG_BACKUP_SEMANTICS,
      NULL);
      end;

      erhalte ich immer den Fehler 'Invalid variant type conversion'. Wo liegt denn da der Fehler

      Comment


      • #4
        Soweit ich weiss sind ein Teil der W-Funktionen schlicht nicht implementiert in win98. Will heissen der Rueckgabewert sagt Fehler

        Comment


        • #5
          Hallo,

          der Fehler verbirgt sich hinter dem letzter Parameter <b>NULL</b>. In der Delphi-Unit <i>Windows</i> wird die Funktion folgendermassen deklariert:
          <pre>
          function CreateFile(lpFileName: PChar; dwDesiredAccess, dwShareMode: DWORD;
          lpSecurityAttributes: PSecurityAttributes; dwCreationDisposition, dwFlagsAndAttributes: DWORD;
          hTemplateFile: THandle): THandle; stdcall;
          </pre>
          Somit darf für <i>hTemplateFile</i> nicht NULL (wird in der Unit System als <b>Null: Variant;</b> deklariert) übergeben werden, sondern die Zahl "0":
          <pre>
          procedure TForm1.Button1Click(Sender: TObject);
          const
          FILE_LIST_DIRECTORY = $0001;
          var
          hDir: THandle;
          begin
          hDir:= CreateFile('C:\temp', FILE_LIST_DIRECTORY,
          FILE_SHARE_READ or FILE_SHARE_DELETE,
          nil, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0);

          end;
          </pre&gt

          Comment


          • #6
            Hallo nochmal,<p>
            Soweit ich mich an den damaligen Versuch erinnern kann, lief das alles schon ganz gut, allerdings synchron.<br>
            Jetzt versuche ich mich gerade an einer asynchronen Fassung mittels 'GetQueuedCompletionStatus' und eines Threads,<br>
            der dann die Daten verarbeitet. Dazu habe ich mit 'CreateIOCompletionPort' einen solchen CompPort erstellt und mit<br>
            dem zu überwachenden Verzeichnis verbunden (über das Handle hDir). Nun reagiert der Thread aber nicht, wenn im<br>
            Verzeichnis z.B. eine Datei erstellt wird. Da er aber auf 'PostQueuedCompletionStatus' reagiert, kann das Problem ja<br>
            eigentlich nicht beim Thread liegen, weshalb ich davon ausgehe, beim Verbinden des CompPorts und des Verzeichnishandles<br>
            oder ähnlichem einen Fehler zu machen, ich weiß nur nicht, wo...<p>
            Könnte mir also vielleicht jemand ein Beispiel schicken, wie's funktioniert, bitte

            Comment

            Working...
            X