Einzelnen Beitrag anzeigen

Benutzerbild von Truther
Truther

Registriert seit: 27. Mai 2013
9 Beiträge
 
#1

Schreibschutz eines Wechselmediums auslesen

  Alt 18. Sep 2014, 20:55
Hallöchen sehr geehrte Delphi-Praxis-Community,

ich bin dabei, den Schreibschutz, also die WriteProtection, eines Mediums zu ermitteln (insbesondere eines USB-Sticks). Ich nutze den WMI Delphi Code Creator um folgenden Code zu erzeugen:

Delphi-Quellcode:
//-----------------------------------------------------------------------------------------------------
// This code was generated by the Wmi Delphi Code Creator (WDCC) Version 1.8.5.0
// http://code.google.com/p/wmi-delphi-code-creator/
// Blog http://theroadtodelphi.wordpress.com/wmi-delphi-code-creator/
// Author Rodrigo Ruz V. (RRUZ) Copyright (C) 2011-2014
//-----------------------------------------------------------------------------------------------------
//
// LIABILITY DISCLAIMER
// THIS GENERATED CODE IS DISTRIBUTED "AS IS". NO WARRANTY OF ANY KIND IS EXPRESSED OR IMPLIED.
// YOU USE IT AT YOUR OWN RISK. THE AUTHOR NOT WILL BE LIABLE FOR DATA LOSS,
// DAMAGES AND LOSS OF PROFITS OR ANY OTHER KIND OF LOSS WHILE USING OR MISUSING THIS CODE.
//
//----------------------------------------------------------------------------------------------------
program GetWMI_Info;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  ActiveX,
  ComObj,
  Variants;
  

    
// Die Klasse "Win32_PhysicaMedia" stellt sämtliche Typen der Dokumentation oder
// Speichergeräte, wie z. B. Bänder, CDs usw., dar.

procedure GetWin32_PhysicalMediaInfo;
const
  WbemUser ='';
  WbemPassword ='';
  WbemComputer ='localhost';
  wbemFlagForwardOnly = $00000020;
var
  FSWbemLocator : OLEVariant;
  FWMIService : OLEVariant;
  FWbemObjectSet: OLEVariant;
  FWbemObject : OLEVariant;
  oEnum : IEnumvariant;
  iValue : LongWord;
begin;
  FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
  FWMIService := FSWbemLocator.ConnectServer(WbemComputer, 'root\CIMV2', WbemUser, WbemPassword);
  FWbemObjectSet:= FWMIService.ExecQuery('SELECT * FROM Win32_PhysicalMedia','WQL',wbemFlagForwardOnly);
  oEnum := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant;
  while oEnum.Next(1, FWbemObject, iValue) = 0 do
  begin
    Writeln(Format('WriteProtectOn %s',[String(FWbemObject.WriteProtectOn)]));// Boolean
        
    Writeln('');
    FWbemObject:=Unassigned;
  end;
end;

begin
 try
    CoInitialize(nil);
    try
      GetWin32_PhysicalMediaInfo;
    finally
      CoUninitialize;
    end;
 except
    on E:EOleException do
        Writeln(Format('EOleException %s %x', [E.Message,E.ErrorCode]));
    on E:Exception do
        Writeln(E.Classname, ':', E.Message);
 end;
 Writeln('Press Enter to exit');
 Readln;
end.
Das Problem: Es wird eine Exception mit folgendem Inhalt ausgelöst:

EVariantTypeCastError: Variante des Typs (NULL) konnte nicht in Typ (String) konvertiert werden.

Ist es gar nicht möglich, die Eigenschaft auszulesen? Dem Anschein nach kann nichts ausgelesen werden.

Ich bin über jede hilfreiche Antwort dankbar.

MfG
-- Truther
"Lass Dir von niemanden je einreden, dass Du was nicht kannst. Wenn Du einen Traum hast, musst du ihn beschützen. Wenn andere was nicht können, wollen sie dir immer einreden, dass du es auch nicht kannst. Wenn du was willst, dann mach es! Basta." - Will Smith
  Mit Zitat antworten Zitat