Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Numero serie de Discos fisicos, continua de César C. Salazar

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Numero serie de Discos fisicos, continua de César C. Salazar Responder citando

Con este codigo extraigo el serial de todos los discos fisicos del mi PC,
Ordenados de la A a la Z y situados en cada linea del TMemo.

El codigo lo extraí de la pagina de comenta César C. Salazar González.

Si aguien puede mejorarlo y o reducirlo mejor que mejor para todos.

Fichero Unit1.cpp
Código:

//---------------------------------------------------------------------------

#include <vcl.h>
#include <comdef.h>
#include <wbemidl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
   : TForm(Owner)
{
  CoInitialize(NULL);
  if(CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0) != S_OK)
   {
    // Este Mensaje ya lo encontre así
                     ShowMessage("ÎÞ·¨»ñȡȨÏÞ!");
    Application->Terminate();
   }

}
//---------------------------------------------------------------------------
__fastcall TForm1::~TForm1()
{
  CoUninitialize();
}
//---------------------------------------------------------------------------
void GetWmiInfo(TStrings *lpList, WideString wsClass)
{
  IWbemLocator *pWbemLocator = NULL;
  if(CoCreateInstance(CLSID_WbemAdministrativeLocator, NULL, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, IID_IUnknown, (void**)&pWbemLocator) == S_OK)
   {
    IWbemServices *pWbemServices = NULL;
    WideString wsNamespace = (L"root\\cimv2");
    if(pWbemLocator->ConnectServer(wsNamespace, NULL, NULL, NULL, 0, NULL, NULL, &pWbemServices) == S_OK)
     {
      IEnumWbemClassObject *pEnumClassObject = NULL;
      WideString wsWQL=L"WQL", wsQuery=WideString(L"Select * from ")+wsClass;
      if(pWbemServices->ExecQuery(wsWQL, wsQuery, WBEM_FLAG_RETURN_IMMEDIATELY,NULL, &pEnumClassObject) == S_OK)
       {
         IWbemClassObject *pClassObject = NULL;
         ULONG uCount = 1, uReturned;
         if(pEnumClassObject->Reset() == S_OK)
         {
           int iEnumIdx = 0;
           while(pEnumClassObject->Next(WBEM_INFINITE, uCount, &pClassObject, &uReturned) == S_OK)
            {

             SAFEARRAY *pvNames = NULL;
             if(pClassObject->GetNames(NULL, WBEM_FLAG_ALWAYS | WBEM_MASK_CONDITION_ORIGIN, NULL, &pvNames) == S_OK)
              {
               long vbl, vbu;
               SafeArrayGetLBound(pvNames, 1, &vbl);
               SafeArrayGetUBound(pvNames, 1, &vbu);
               for(long idx=vbl; idx<=vbu; idx++)
                {
                  long aidx = idx;
                  wchar_t *wsName = 0;
                  VARIANT vValue;
                  VariantInit(&vValue);
                  SafeArrayGetElement(pvNames, &aidx, &wsName);

                  BSTR bs = SysAllocString(wsName);
                  HRESULT hRes = pClassObject->Get(bs, 0, &vValue, NULL, 0);
                  SysFreeString(bs);

                  if(hRes == S_OK)
                  {
                    AnsiString s;
                    Variant v = *(Variant*)&vValue;
                    if(v.IsArray())
                     {
                      for(int i=v.ArrayLowBound(); i<=v.ArrayHighBound(); i++)
                       {
                        Variant a = v.GetElement(i);
                        if(!s.IsEmpty())
                          s+=", ";
                        s+=VarToStr(a);
                       }
                     }
                    else
                     {
                      s = VarToStr(v);
                     }
                    //----------------------------------------------------
                    if(AnsiString(wsName) == "SerialNumber")
                       lpList->Add(s);
                    //----------------------------------------------------
                  }

                  VariantClear(&vValue);
                  SysFreeString(wsName);
                }
              }
             if(pvNames)SafeArrayDestroy(pvNames);
             iEnumIdx++;
            }
         }
         if(pClassObject)pClassObject->Release();
       }
      if(pEnumClassObject)pEnumClassObject->Release();
     }
    if(pWbemServices)pWbemServices->Release();
   }
  if(pWbemLocator)pWbemLocator->Release();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::BtnSerialClick(TObject *Sender)
{
   Memo1->Clear();
   GetWmiInfo(Memo1->Lines, "Win32_PhysicalMedia");
}
//---------------------------------------------------------------------------



Fichero Unit1.h

Código:

//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:   // IDE-managed Components
   TMemo *Memo1;
   TButton *Button1;
   void __fastcall BtnSerialClick(TObject *Sender);
private:   // User declarations
public:      // User declarations
   __fastcall TForm1(TComponent* Owner);
   __fastcall ~TForm1();
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif


Colocar en un Form un TMemo y un TButton.
Cada linea que se genera en el TMemo es el correspondiente al Numero de serie de un disco duro.

En mi caso tengo dos discos duros y los numeros de serie que me dá este codigo son:

30534838314a5930334330333033202020202020
30534838314a5930334330333133202020202020

Pero con el programa AIDA 32 Obtengo los siquientes numeros de serie:

S08HJ10YC33030
S08HJ10YC33031



Espero que les sea de ayuda y que alguien pueda mejorar este codigo.
_________________
Muchos hombres no se equivocan jamás porque no se proponen nada razonable.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor
Mensaje    Asunto: Responder citando

son los mismos numeros.
Mira:

tu serial: 3053 4838 .....
AIDA: 5330 3848 que pasados de hex a ASCII S0 8H

Simplemente da la vuelta a cada par de bytes de hex y muestra el ascii

Saludos, Bosoft.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Gracias por la aclaracion. Y que funcion utilizo para cambiar el serial a ascii?


Estoy en ello...
_________________
Muchos hombres no se equivocan jamás porque no se proponen nada razonable.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor
Mensaje    Asunto: Solucionado Responder citando

https://cppbuilder.es/viewtopic.php?p=35087#35087
_________________
Muchos hombres no se equivocan jamás porque no se proponen nada razonable.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor
Mensaje    Asunto: No encuentra wbemuuid.lib Responder citando

Jesus,

Estaba probando tu codigo y me da un error de Linkado por que no encuentra la libreria wbemuuid.lib

De donde es esa libreria? no la encuentro por ningun lado.

Un abrazo.

Carlos
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Jesus,

Buscando he encontrado la libreria y la he tenido que convertir con el coff2omf.exe para que el Builder la aceptara y aparentemente no da errores, el problema que me da ahora es que una vez compìlado y ejecutado el programa en el campo Memo en vez de poner el numero de serie pone "Volume0"

Ademas deberia ponerme de los dos discos que tengo no? tengo uno IDE y uno SATA no se si tiene que ver.

Sabes por que pasa eso?

Un abrazo.

Carlos
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

He hecho esto en un momento a ver si te sirve



String cadena,provis,EnHex;
int i,j;


// Este es el String si no recuerdo mal de tu primer disco
cadena="30534838314a5930334330333033202020202020";

EnHex="";
for (i=1;i<=cadena.Length();i=i+4)
{
provis=cadena[i+2];provis=provis+cadena[i+3];
j=HexADec(provis);
EnHex=EnHex+char(j);
provis=cadena[i];provis=provis+cadena[i+1];
j=HexADec(provis);
EnHex=EnHex+char(j);
}

// Aqui en EnHex tendremos esto S08HJ10YC33030


Ultima edición por philips el Jue 03 Ene, 2008 10:36 pm, editado 1 vez
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

//No se porque pero no he podido poner debajo la funcion HexADec
// Esta función es de César Salazar
// Funciona perfectamente

int HexADec(AnsiString Cadena)
{
int Resultado=0;
int valor=0;
int Potencia =1;
int Base = 16;
for(int pos=Cadena.Length();pos>0;pos--)
{
switch(Cadena[pos])
{
case 'A':
case 'a':
valor = 10 * Potencia;
break;
case 'B':
case 'b':
valor = 11 * Potencia;
break;
case 'C':
case 'c':
valor = 12 * Potencia;
break;
case 'D':
case 'd':
valor = 13 * Potencia;
break;
case 'E':
case 'e':
valor = 14 * Potencia;
break;
case 'F':
case 'f':
valor = 15 * Potencia;
break;
default:
valor = StrToInt(Cadena[pos]) * Potencia;
break;
}
Potencia*= Base; //Incremento a 16;
Resultado+=valor;
}
return (Resultado);
}

Saludos

Phil


Ultima edición por philips el Vie 04 Ene, 2008 11:08 pm, editado 1 vez
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

No, creo que el problema no es ese.

En el primer disco dice "Volume0" y del segundo no dice nada, creo que debe ser quizas un problema con la libreria que estoy usando o algun cambio en windows o algo asi, pero es que no hace nada de lo que se supone, estoy investigando a ver si pillo el rollo.

Teneis algun ejemplo completo a ver si funciona?

Un abrazo,

Carlos
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.