none
System.Management.dll RRS feed

  • Pergunta

  • Olá galera,

    desenvolvi uma aplicação em c# winforms com framework 2.0, e funciona muito bem no xp, só que fui instalar no win 98 e não funciona nada bem.

    uso a DLL System.Management para buscar o serial do HD e gera o seguinte erro:

    System.Runtime.InteropServices.COMException (0x80040154):
       Retrieving the COM class factory for component with CLSID
          {4590F811-1D3A-11D0-891F-00AA004B2E24} failed due to the following error: 80040154.
     
     at System.Management.ManagementScope.Initialize()
       at System.Management.ManagementObjectSearcher.Initialize()
       at System.Management.ManagementObjectSearcher.Get()

    uso outras DLLs tambêm, não testei, mas provavelmente acontecerá o mesmo erro.

    Agradeço desde já.

    sábado, 24 de março de 2007 14:25

Respostas

  • Tente obter o serial do volume com API:

    // Declaração.
    [DllImport("Kernel32.dll", CharSet = CharSet.Auto)]
    private extern static bool GetVolumeInformation(
      string lpRootPathName,
      StringBuilder lpVolumeNameBuffer,
      int nVolumeNameSize,
      out uint lpVolumeSerialNumber,
      out uint lpMaximumComponentLength,
      out uint lpFileSystemFlags,
      StringBuilder lpFileSystemNameBuffer,
      int nFileSystemNameSize);

    // Uso.
    StringBuilder volname = new StringBuilder(256);
    StringBuilder fsname = new StringBuilder(256);
    uint sernum, maxlen, flags;
    // Informações do drive (C: no exemplo).
    if (GetVolumeInformation("C:\\", volname, volname.Capacity, out sernum, out maxlen, out flags, fsname, fsname.Capacity))
    {
        // Exibe número de série do volume.
        Console.WriteLine(sernum.ToString());
    }

    Para usar o código também importe o namespace System.Runtime.InteropServices.

    sábado, 24 de março de 2007 17:06

Todas as Respostas

  • Tente obter o serial do volume com API:

    // Declaração.
    [DllImport("Kernel32.dll", CharSet = CharSet.Auto)]
    private extern static bool GetVolumeInformation(
      string lpRootPathName,
      StringBuilder lpVolumeNameBuffer,
      int nVolumeNameSize,
      out uint lpVolumeSerialNumber,
      out uint lpMaximumComponentLength,
      out uint lpFileSystemFlags,
      StringBuilder lpFileSystemNameBuffer,
      int nFileSystemNameSize);

    // Uso.
    StringBuilder volname = new StringBuilder(256);
    StringBuilder fsname = new StringBuilder(256);
    uint sernum, maxlen, flags;
    // Informações do drive (C: no exemplo).
    if (GetVolumeInformation("C:\\", volname, volname.Capacity, out sernum, out maxlen, out flags, fsname, fsname.Capacity))
    {
        // Exibe número de série do volume.
        Console.WriteLine(sernum.ToString());
    }

    Para usar o código também importe o namespace System.Runtime.InteropServices.

    sábado, 24 de março de 2007 17:06
  • Valeu a dica, mas quando uso o Management vem um número diferente deste seu código!

     mas tu sabe responder porque não funciona no win 98 ?

    uso estas tambêm e não funciona.

    office.dll

    Interop.Word.dll

    Valeu...

    sábado, 24 de março de 2007 19:15
  •  zilli wrote:

    Valeu a dica, mas quando uso o Management vem um número diferente deste seu código!

    É que você deve estar pegando o número de série do HD (o que não funciona necessariamente com todos os HDs e por isso, talvez, fosse melhor usar o numero de série do volume) e não de um volume. Para fazer isso com APIs é um pouco mais compilicado. Há um exemplo em VB6 no link que pode ser convertido para C#:

    http://vbnet.mvps.org/index.html?code/disk/smartide.htm

     zilli wrote:

     mas tu sabe responder porque não funciona no win 98 ?

    uso estas tambêm e não funciona.

    office.dll

    Interop.Word.dll

    Valeu...

    O System.Management depende de recursos que devem estar disponíveis nas diferentes versões do Windows. Por exemplo, classes como Win32_ProcessStopTrace e Win32_PingStatus só existem no WinXP e versões superiores, assim um código como o abaixo falharia em versões do Windows anteriores ao XP.

    SelectQuery objQuery = new SelectQuery("SELECT * FROM Win32_PingStatus WHERE Address = <um endereço>");
    ManagementObjectSearcher objSearch = new ManagementObjectSearcher(objQuery);
    int c = objSearch.Get().Count;

    Provavelmente o recurso usado pelo WMI para obter a informação do HD não está disponível no Win98. Como nunca tentei fazer isso no Win98 não posso dizer com certeza. Dê uma olhada na documentação das classes que você está usando.

     

    sábado, 24 de março de 2007 20:27
  • Obrigado!
    segunda-feira, 26 de março de 2007 11:15
  • Você saberia como criar o mesmo recurso para o VB3 , para usa-lo no Windows 98 ?

    quinta-feira, 23 de agosto de 2007 01:47