+ Rispondi al Thread
Visualizzazione dei risultati da 1 a 7 su 7

Discussione: Errore durante l'uso di fsutil con Delphi XE

  1. #1
    L'avatar di camaleonteplus
    camaleonteplus non è in linea Scolaretto
    Luogo
    Caserta
    Post
    140

    Errore durante l'uso di fsutil con Delphi XE

    devo eseguire questo comando fsutil behavior query disabledeletenotify in MS-DOS ho usato questo codice:
    codice:
    unit Unit1;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;
    
    type
      TForm1 = class(TForm)
        Button1: TButton;
        Memo1: TMemo;
        procedure Button1Click(Sender: TObject);
        procedure RunDosInMemo(Que: String;EnMemo: TMemo);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
    
    var
      Form1: TForm1;
    
    implementation
    
    {$R *.dfm}
    
    procedure TForm1.Button1Click(Sender: TObject);
    procedure RunDosInMemo(Que: String;EnMemo: TMemo);
      const
        CUANTOBUFFER = 2000;
      var
        Seguridades         : TSecurityAttributes;
        PaLeer,PaEscribir   : THandle;
        start               : TStartUpInfo;
        ProcessInfo         : TProcessInformation;
        Buffer              : Pchar;
        BytesRead           : DWord;
        CuandoSale          : DWord;
      begin
        With Seguridades do
        begin
          nlength              := SizeOf(TSecurityAttributes);
          binherithandle       := true;
          lpsecuritydescriptor := nil;
        end;
        if Createpipe (PaLeer, PaEscribir, @Seguridades, 0) then
        begin
          Buffer  := AllocMem(CUANTOBUFFER + 1);
          FillChar(Start,Sizeof(Start),#0);
          start.cb          := SizeOf(start);
          start.hStdOutput  := PaEscribir;
          start.hStdInput   := PaLeer;
          start.dwFlags     := STARTF_USESTDHANDLES +
                               STARTF_USESHOWWINDOW;
          start.wShowWindow := SW_HIDE;
    
          if CreateProcess(nil,
            PChar(Que),
            @Seguridades,
            @Seguridades,
            true,
            NORMAL_PRIORITY_CLASS,
            nil,
            nil,
            start,
            ProcessInfo)
          then
            begin
              repeat
                CuandoSale := WaitForSingleObject(ProcessInfo.hProcess,100);
                Application.ProcessMessages;
              until (CuandoSale <> WAIT_TIMEOUT);
              Repeat
                BytesRead := 0;
                ReadFile(PaLeer,Buffer[0],CUANTOBUFFER,BytesRead,nil);
                Buffer[BytesRead] := #0;
                OemToAnsi(Buffer,Buffer);
                EnMemo.Text := EnMemo.text + String(Buffer);
              until (BytesRead < CUANTOBUFFER);
            end;
          FreeMem(Buffer);
          CloseHandle(ProcessInfo.hProcess);
          CloseHandle(ProcessInfo.hThread);
          CloseHandle(PaLeer);
          CloseHandle(PaEscribir);
        end;
      end;
    
    begin
      RunDosInMemo('fsutil behavior query disabledeletenotify',Memo1);
    end;
    
    end.
    sotto delphi 7 funzionava adesso mi da questo errore:
    [DCC Error] Unit1.pas(78): E2010 Incompatible types: 'PAnsiChar' and 'PWideChar'

  2. #2
    L'avatar di camaleonteplus
    camaleonteplus non è in linea Scolaretto
    Luogo
    Caserta
    Post
    140

    MS-DOS fsutil behavior query disabledeletenotify

    codice:
    unit Unit1;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;
    
    type
      TForm1 = class(TForm)
        Button1: TButton;
        Memo1: TMemo;
        procedure Button1Click(Sender: TObject);
        function RunCaptured(const dirName, exeName, cmdLine: string): Boolean;
      private
        { Private declarations }
      public
        { Public declarations }
      end;
    
    var
      Form1: TForm1;
    
    implementation
    
    {$R *.dfm}
    
    procedure TForm1.Button1Click(Sender: TObject);
    begin
    RunCaptured('C:\', 'cmd.exe', '/fsutil behavior query disabledeletenotify');
    end;
    
    function TForm1.RunCaptured(const dirName, exeName, cmdLine: string): Boolean;
    var
      start: TStartupInfo;
      procInfo: TProcessInformation;
      tmpName: string;
      tmp: Windows.THandle;
      tmpSec: TSecurityAttributes;
      res: TStringList;
      return: Cardinal;
    begin
      Result := False;
      try
      { Predispone un file temporaneo }
        tmpName := 'temp.tmp';
        FillChar(tmpSec, SizeOf(tmpSec), #0);
        tmpSec.nLength := SizeOf(tmpSec);
        tmpSec.bInheritHandle := True;
        tmp := Windows.CreateFile(PChar(tmpName),Generic_Write, File_Share_Write,@tmpSec, Create_Always, File_Attribute_Normal, 0);
        try
          { Imposta la struttura SturtupInfo del processo }
          FillChar(start, SizeOf(start), #0);
          start.cb          := SizeOf(start);
          start.hStdOutput  := tmp;  // connette l'output del programma al file temporaneo
          start.dwFlags     := StartF_UseStdHandles or StartF_UseShowWindow;
          start.wShowWindow := SW_Hide;
    
          { Crea il processo }
          if CreateProcess(nil, PChar(exeName + ' ' + cmdLine), nil, nil, True,0, nil, PChar(dirName), start, procInfo) then begin
            { Se la creazione è andata a buon fine:
              imposta la sua classe di priorità }
            SetPriorityClass(procInfo.hProcess, Idle_Priority_Class);
            { Aspetta la conclusione del programma }
            WaitForSingleObject(procInfo.hProcess, Infinite);
            GetExitCodeProcess(procInfo.hProcess, return);
            Result := (return = 0);
            {ripulisce tutto}
            CloseHandle(procInfo.hThread);
            CloseHandle(procInfo.hProcess);
            Windows.CloseHandle(tmp);
    
            { Legge il file prodotto e lo visualizza in un memo }
            res := TStringList.Create;
            try
              res.LoadFromFile(tmpName);
              Memo1.Lines.AddStrings(res);
            finally
              res.Free;
            end;
            Windows.DeleteFile(PChar(tmpName));
          end
          else begin
            Application.MessageBox(PChar(SysErrorMessage(GetLastError())),'RunCaptured Error', MB_OK);
          end;
        except
          Windows.CloseHandle(tmp);
          Windows.DeleteFile(PChar(tmpName));
          raise;
        end;
      finally
      end;
    end;
    end.
    Scusate ho dimenticato di inserire un titolo adeguato. Adesso cosi funziona ho il problema che se cerco di usare questo comando DOS:
    fsutil behavior query disabledeletenotify
    il mio programma si blocca, non reisco a capire il perchè

  3. #3
    L'avatar di AntonioG
    AntonioG non è in linea Moderatore Globale Ultimo blog: Commodore 64 e Codemotion
    Luogo
    Roma
    Post
    16,215
    Blogs
    5
    Di quale "titolo" parli? Cosa hai fatto?

    In ogni caso, se non sbaglio, utilizza esplicitamente PAnsiChar al posto di PChar


    P.S. Piuttosto ... il titolo del thread "Delphi XE" non significa nulla ... questa volta lo cambio io ma non sei nuovo e la prossima volta il thread viene chiuso.
    Ultima modifica di AntonioG; 10-12-2017 13:34 
    Avvisi generali e importanti, a pena CHIUSURA thread e/o BAN
    Il crossposting è vietato.
    Le richieste di "pappa pronta" sono vietate.
    Utilizzate i tag CODE per il codice.
    Leggere il Regolamento per chiarimenti PRIMA di creare nuovi thread.
    Utilizzare sempre i PM per comunicare con i moderatori.
    Non mi contattate in PM per problemi di software, usate il forum

  4. #4
    L'avatar di camaleonteplus
    camaleonteplus non è in linea Scolaretto
    Luogo
    Caserta
    Post
    140
    Grazie e scusa! Sto cercando di creare un programma che mi esegua un comando dos e mi riporti il risultato in un memo, con il codice che ho messo sopra funziona con molti comandi dos tranne con fsutil behavior query disabledeletenotify e non reisco a capire il perchè.

  5. #5
    L'avatar di AntonioG
    AntonioG non è in linea Moderatore Globale Ultimo blog: Commodore 64 e Codemotion
    Luogo
    Roma
    Post
    16,215
    Blogs
    5
    Perché scrivi

    '/fsutil

    con quella /

    ?
    Avvisi generali e importanti, a pena CHIUSURA thread e/o BAN
    Il crossposting è vietato.
    Le richieste di "pappa pronta" sono vietate.
    Utilizzate i tag CODE per il codice.
    Leggere il Regolamento per chiarimenti PRIMA di creare nuovi thread.
    Utilizzare sempre i PM per comunicare con i moderatori.
    Non mi contattate in PM per problemi di software, usate il forum

  6. #6
    L'avatar di camaleonteplus
    camaleonteplus non è in linea Scolaretto
    Luogo
    Caserta
    Post
    140
    per dare il comando. comunque ho provato anche senza / ma si blocca comunque.

  7. #7
    L'avatar di AntonioG
    AntonioG non è in linea Moderatore Globale Ultimo blog: Commodore 64 e Codemotion
    Luogo
    Roma
    Post
    16,215
    Blogs
    5
    Ma "si blocca" che vuol dire esattamente?
    Avvisi generali e importanti, a pena CHIUSURA thread e/o BAN
    Il crossposting è vietato.
    Le richieste di "pappa pronta" sono vietate.
    Utilizzate i tag CODE per il codice.
    Leggere il Regolamento per chiarimenti PRIMA di creare nuovi thread.
    Utilizzare sempre i PM per comunicare con i moderatori.
    Non mi contattate in PM per problemi di software, usate il forum

+ Rispondi al Thread

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi