 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
JesúsGandia Master


Registrado: 17 Jul 2004Mensajes: 403Ubicación: Gandia, Valencia
|
Publicado: Jue 09 Nov, 2006 10:40 pm Asunto: Numero serie de Discos fisicos, continua de César C. Salazar |
|
|
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 |
|
 |
bosoft Master

Registrado: 23 Oct 2005Mensajes: 342
|
Publicado: Jue 09 Nov, 2006 11:55 pm Asunto: |
|
|
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 |
|
 |
JesúsGandia Master


Registrado: 17 Jul 2004Mensajes: 403Ubicación: Gandia, Valencia
|
Publicado: Vie 10 Nov, 2006 1:42 pm Asunto: |
|
|
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 |
|
 |
JesúsGandia Master


Registrado: 17 Jul 2004Mensajes: 403Ubicación: Gandia, Valencia
|
|
| Volver arriba |
|
 |
Carlos J. Fernandez Master


Registrado: 27 Oct 2004Mensajes: 574
|
Publicado: Jue 03 Ene, 2008 6:12 pm Asunto: No encuentra wbemuuid.lib |
|
|
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 |
|
 |
Carlos J. Fernandez Master


Registrado: 27 Oct 2004Mensajes: 574
|
Publicado: Jue 03 Ene, 2008 6:50 pm Asunto: |
|
|
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 |
|
 |
philips Capt

Registrado: 16 Nov 2005Mensajes: 154
|
Publicado: Jue 03 Ene, 2008 10:30 pm Asunto: |
|
|
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 |
|
 |
philips Capt

Registrado: 16 Nov 2005Mensajes: 154
|
Publicado: Jue 03 Ene, 2008 10:35 pm Asunto: |
|
|
//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 |
|
 |
Carlos J. Fernandez Master


Registrado: 27 Oct 2004Mensajes: 574
|
Publicado: Vie 04 Ene, 2008 5:59 pm Asunto: |
|
|
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 |
|
 |
|
|
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
|
© 2002–2026 Club Builder · Funciona con phpBB.
|