Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   "Gerät auswerfen" Funktion gesucht (https://www.delphipraxis.net/180440-geraet-auswerfen-funktion-gesucht.html)

blablab 21. Mai 2014 01:49

"Gerät auswerfen" Funktion gesucht
 
Hallo!

[Beim Auslesen der SMART-Werte meiner Externen Festplatte ist mir aufgefallen dass ich die HDD 757 Mal an/ausgeschaltet habe und davon 518 mal "hart" (Stromzufuhr während des Betriebs unterbrochen). Das liegt daran, dass ich den USB Stecker nicht ziehe. Ich werfe die HDD mit "Hardware sicher entfernen" aus und schalte dann die HDD mit dem An/Ausschalter am Gerät aus. Und scheinbar lässt Windows die HDD ganz normal weiterlaufen auch wenn sie bereits ausgeworfen wurde.]

Ich bin mal auf eine Windows-Api-Funktion gestoßen die in etwa "Eject/Remove Media/Device" hieß. Die Funktion hatte scheinbar nichts mit "Hardware sicher entfernen" zu tun und ich glaube man konnte die HDD danach nicht mehr verwenden (erst wieder nach dem Aus- und Einstecken). Ich bin mir aber sicher, dass die HDD beim Ausführen der Funktion aufgehört hat sich zu drehen, also genau das was ich gerne hätte. Weiß jemand wie diese Funktion heißt???

Grüße
blablab

sx2008 21. Mai 2014 02:40

AW: "Gerät auswerfen" Funktion gesucht
 
Zitat:

Zitat von blablab (Beitrag 1259575)
Und scheinbar lässt Windows die HDD ganz normal weiterlaufen auch wenn sie bereits ausgeworfen wurde.

Das lässt sich wohl über eine Einstellung in der Registry ändern:
http://support.microsoft.com/kb/2401954

hathor 21. Mai 2014 06:23

AW: "Gerät auswerfen" Funktion gesucht
 
Liste der Anhänge anzeigen (Anzahl: 1)
Geht mit DEVCON - das gibt es bei MICROSOFT:

Delphi-Quellcode:
function GetConsoleOutput(Command : string;
                          Output, Errors : TStringList) : Boolean;
var
  Buffer           : array[0..255] of Char;
  CreationFlags    : DWORD;
  NumberOfBytesRead : DWORD;
  PipeErrorsRead   : THandle;
  PipeErrorsWrite  : THandle;
  PipeOutputRead   : THandle;
  PipeOutputWrite  : THandle;
  ProcessInfo      : TProcessInformation;
  SecurityAttr     : TSecurityAttributes;
  StartupInfo      : TStartupInfo;
  Stream           : TMemoryStream;
begin
  //Initialisierung ProcessInfo
  FillChar(ProcessInfo, SizeOf(TProcessInformation), 0);

  //Initialisierung SecurityAttr
  FillChar(SecurityAttr, SizeOf(TSecurityAttributes), 0);
  SecurityAttr.nLength             := SizeOf(TSecurityAttributes);
  SecurityAttr.bInheritHandle      := True;
  SecurityAttr.lpSecurityDescriptor := nil;

  //Pipes erzeugen
  CreatePipe(PipeOutputRead, PipeOutputWrite, @SecurityAttr, 0);
  CreatePipe(PipeErrorsRead, PipeErrorsWrite, @SecurityAttr, 0);

  //Initialisierung StartupInfo
  FillChar(StartupInfo, SizeOf(TStartupInfo), 0);
  StartupInfo.cb         := SizeOf(TStartupInfo);
  StartupInfo.hStdInput  := 0;
  StartupInfo.hStdOutput := PipeOutputWrite;
  StartupInfo.hStdError  := PipeErrorsWrite;
  StartupInfo.wShowWindow := SW_HIDE;
  StartupInfo.dwFlags    := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;

  CreationFlags := CREATE_DEFAULT_ERROR_MODE or
                   CREATE_NEW_CONSOLE or
                   NORMAL_PRIORITY_CLASS;

  // Folgende Zeile ist nur für Delphi ab 2009 erforderlich:
  UniqueString(Command);

  if CreateProcess(nil,
                   PChar(Command),
                   nil,
                   nil,
                   True,
                   CreationFlags,
                   nil,
                   nil,
                   StartupInfo,
                   ProcessInfo) then
  begin
    Result := True;
    //Write-Pipes schließen
    CloseHandle(PipeOutputWrite);
    CloseHandle(PipeErrorsWrite);

    //Ausgabe Read-Pipe auslesen
    Stream := TMemoryStream.Create;
    try
      while ReadFile(PipeOutputRead, Buffer, 255, NumberOfBytesRead, nil) do
      begin
        Stream.Write(Buffer, NumberOfBytesRead);
      end;
      Stream.Position := 0;
      Output.LoadFromStream(Stream);
    finally
      Stream.Free;
    end;
    CloseHandle(PipeOutputRead);

    //Fehler Read-Pipe auslesen
    Stream := TMemoryStream.Create;
    try
      while ReadFile(PipeErrorsRead, Buffer, 255, NumberOfBytesRead, nil) do
      begin
        Stream.Write(Buffer, NumberOfBytesRead);
      end;
      Stream.Position := 0;
      Errors.LoadFromStream(Stream);
    finally
      Stream.Free;
    end;
    CloseHandle(PipeErrorsRead);

    WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
    CloseHandle(ProcessInfo.hProcess);
  end
  else
  begin
    Result := False;
    CloseHandle(PipeOutputRead);
    CloseHandle(PipeOutputWrite);
    CloseHandle(PipeErrorsRead);
    CloseHandle(PipeErrorsWrite);
  end;
end;

procedure TForm2.Button1Click(Sender: TObject);
var
  Output : TStringList;
  Errors : TStringList;
begin
  Output := TStringList.Create;
  Errors := TStringList.Create;
  Memo1.Lines.Add('----------------------USB OFF---------------------');
  try
    if GetConsoleOutput('devcon.exe disable USB\ROOT_HUB20', Output, Errors) // USB2.0
    then Memo1.Lines.AddStrings(Output); Memo1.Lines.Add('');
    if GetConsoleOutput('devcon.exe disable USB\ROOT_HUB30', Output, Errors) // USB3.0
    then Memo1.Lines.AddStrings(Output);
  finally
    Output.free;
    Errors.free;
  end;
end;

procedure TForm2.Button2Click(Sender: TObject);
var
  Output : TStringList;
  Errors : TStringList;
begin
  Output := TStringList.Create;
  Errors := TStringList.Create;
  Memo1.Lines.Add('----------------------USB ON----------------------');
  try
    if GetConsoleOutput('devcon.exe enable USB\ROOT_HUB20', Output, Errors) // USB2.0
    then Memo1.Lines.AddStrings(Output); Memo1.Lines.Add('');
    if GetConsoleOutput('devcon.exe enable USB\ROOT_HUB30', Output, Errors) // USB3.0
    then Memo1.Lines.AddStrings(Output);
  finally
    Output.free;
    Errors.free;
  end;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:29 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz