 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
vizca321 Lt


Registrado: 06 May 2008Mensajes: 83Ubicación: Mexico
|
Publicado: Lun 12 Jun, 2017 10:22 pm Asunto: HDD numero Serie WMI BCB6 |
|
|
Hola he tenido problemas con el codigo de este tema
https://cppbuilder.es/viewtopic.php?t=7859&start=0&postdays=0&postorder=asc&highlight=numero+serie y encontre este codigo OpenSourse de Victor Chen de la pag
http://www.cppfans.com/cntfile.asp?fn=wmi_bcb
incluye libreria para bcb 6
y esta es la adaptacion no encuentro URL pagina de nuevo para postear url pero no funciona en BCB6 solo funciona en XE8 necesito
Codigo para BCB6
Cabeceras
agregar libreria de la URL anterior wbemuuid.lib
#include <wbemidl>
#include <utilcls>
| Código: |
__fastcall TForm1::TForm1(TComponent *Owner): TForm(Owner)
{
CoInitializeSecurity(NULL, - 1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, 0);
}
//---------------------------------------------------------------------------
__fastcall TForm1::~TForm1()
{
CoUninitialize();
}
//---------------------------------------------------------------------------
void ObtenerNumeroDeSerie(int nDriveNumber, WideString &strSerialNumber)
{
ULONG uReturn = 0;
HRESULT hr = E_FAIL;
strSerialNumber = L"";
TCHAR strDrivePath[32];
wsprintf(strDrivePath,TEXT("\\\\.\\PHYSICALDRIVE%u"), nDriveNumber);
TComInterface<IWbemLocator> pIWbemLocator;
hr = CoCreateInstance(CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID*)&pIWbemLocator);
TComInterface<IWbemServices> pIWbemServices;
hr = pIWbemLocator->ConnectServer(L"ROOT\\CIMV2", NULL, NULL, 0, NULL, 0, 0, &pIWbemServices);
hr = ::CoSetProxyBlanket(pIWbemServices, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, NULL, RPC_C_AUTHN_LEVEL_CALL, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE);
if(FAILED(hr))
return;
WideString szQueryLanguage = L"WQL";
WideString szQuery = L"SELECT Tag, SerialNumber FROM Win32_PhysicalMedia";
TComInterface <IEnumWbemClassObject> pEnumClassObject;
hr = pIWbemServices->ExecQuery(szQueryLanguage.c_bstr(), szQuery.c_bstr(), WBEM_FLAG_FORWARD_ONLY|WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnumClassObject);
if(FAILED(hr))
return;
while(pEnumClassObject)
{
TComInterface<IWbemClassObject> pIWbemClassObject;
hr = pEnumClassObject->Next(WBEM_INFINITE, 1, &pIWbemClassObject, &uReturn);
if(0 == uReturn || FAILED(hr))
break;
TVariant vtTag;
TVariant vtSerialNumber;
hr = pIWbemClassObject->Get(L"Tag", 0, &vtTag, NULL, NULL);
WideString strTag(vtTag.bstrVal);
if(SameText(strTag, strDrivePath))
{
hr = pIWbemClassObject->Get(L"SerialNumber", 0, &vtSerialNumber, NULL, NULL);
strSerialNumber = vtSerialNumber.bstrVal;
//Form1->Memo1->Lines->Add(/*"Tag = " +*/ strTag) ;
FConfig->Caption = String(strSerialNumber).Trim();
vtTag = NULL;
vtSerialNumber = NULL;
break;
}
}
}
//------------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
WideString sDrv0SerialNumber = L"";
WideString sDrv1SerialNumber = L"";
WideString sDrv2SerialNumber = L"";
WideString sDrv3SerialNumber = L"";
Memo1->Lines->Clear();
//the integer is the number of the drive you want to get serial number for
ObtenerNumeroDeSerie(0, sDrv0SerialNumber);
Form1->Memo1->Lines->Add("");
ObtenerNumeroDeSerie(1, sDrv1SerialNumber);
Form1->Memo1->Lines->Add("");
ObtenerNumeroDeSerie(2, sDrv2SerialNumber);
Form1->Memo1->Lines->Add("");
ObtenerNumeroDeSerie(3, sDrv3SerialNumber);
Form1->Memo1->Lines->Add("");
}
//---------------------------------------------------------------------------
| [url][/url] _________________ [code:1]//----------------Att Gabriel----------------
void Gracias(){
if (Respuesta == true){
Showmessage("Muchisimas Gracias!")
else
Showmessage("Ojala te sirva... ^_^ ");
}[/code:1] |
|
| Volver arriba |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Mar 13 Jun, 2017 2:58 am Asunto: |
|
|
A ver si te vale así, lo he probado en el BCB6, XE4 y 10.1 (solo lo he probado en Windows 10, no sé qué tal ira en otros Windows):
(En este caso no es necesario añadir "wbemuuid.lib")
| Código: |
#include <utilcls.h>
#include <wbemprov.h>
#include <comobj.hpp>
String ObtenerNumeroDeSerie(int nDriveNumber)
{
String strSerialNumber;
String drive = Format("\\\\.\\PHYSICALDRIVE%u", ARRAYOFCONST((nDriveNumber)));
TComInterface<IWbemLocator> locator;
OleCheck(locator.CreateInstance(CLSID_WbemAdministrativeLocator));
TComInterface<IWbemServices> services;
OleCheck(locator->ConnectServer((BSTR)L"ROOT\\CIMV2", NULL, NULL, 0, NULL, 0, 0, &services));
OleCheck(CoSetProxyBlanket(services, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE,
NULL, RPC_C_AUTHN_LEVEL_CALL, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE));
TComInterface<IEnumWbemClassObject> enumClass;
const WideString query = L"SELECT Tag, SerialNumber FROM Win32_PhysicalMedia";
OleCheck(services->ExecQuery((BSTR)L"WQL", query.c_bstr(),
WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &enumClass));
while (enumClass)
{
ULONG uRet = 0;
TComInterface<IWbemClassObject> classObj;
OleCheck(enumClass->Next(WBEM_INFINITE, 1, &classObj, &uRet));
if (!uRet) break;
TVariant vtTag, vtSerialNumber;
OleCheck(classObj->Get(L"Tag", 0, &vtTag, NULL, NULL));
if (SameText(vtTag, drive))
{
OleCheck(classObj->Get(L"SerialNumber", 0, &vtSerialNumber, NULL, NULL));
strSerialNumber = vtSerialNumber;
break;
}
}
return strSerialNumber.Trim();
}
|
|
|
| Volver arriba |
|
 |
vizca321 Lt


Registrado: 06 May 2008Mensajes: 83Ubicación: Mexico
|
Publicado: Mar 13 Jun, 2017 4:23 am Asunto: |
|
|
Espero que si yo nunca e tenido problemas con el código que dejaron en el otro hilo en mis equipos, pero las personas han que adquirido el software si y no puedo revisar directamente el problema.
Ya lo e provado en mis equipos y funciona en Windows 7 y 8.1... Saludos _________________ [code:1]//----------------Att Gabriel----------------
void Gracias(){
if (Respuesta == true){
Showmessage("Muchisimas Gracias!")
else
Showmessage("Ojala te sirva... ^_^ ");
}[/code:1] |
|
| Volver arriba |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Mar 13 Jun, 2017 4:41 am Asunto: |
|
|
| vizca321 escribió: | | nunca e tenido problemas con el código que dejaron en el otro hilo en mis equipos, pero las personas han que adquirido el software si |
No funciona con RAID, que podría ser una de las causas de que no te funcione en algunos equipos. Fíjate si es el caso de las personas a las que no les funciona..
Aunque casualmente en varios equipos con RAID en los que probé, lo que si funciono es el número de serie de la placa base, por si te es útil, con unas ligeras modificaciones (no funciona con todas las placas base):
| Código: | String ObtenerNumeroDeSeriePB()
{
String strSerialNumber;
TComInterface<IWbemLocator> locator;
OleCheck(locator.CreateInstance(CLSID_WbemAdministrativeLocator));
TComInterface<IWbemServices> services;
OleCheck(locator->ConnectServer((BSTR)L"ROOT\\CIMV2", NULL, NULL, 0, NULL, 0, 0, &services));
OleCheck(CoSetProxyBlanket(services, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE,
NULL, RPC_C_AUTHN_LEVEL_CALL, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE));
TComInterface<IEnumWbemClassObject> enumClass;
const WideString query = L"SELECT SerialNumber FROM Win32_BaseBoard";
OleCheck(services->ExecQuery((BSTR)L"WQL", query.c_bstr(),
WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &enumClass));
ULONG uRet = 0;
TComInterface<IWbemClassObject> classObj;
OleCheck(enumClass->Next(WBEM_INFINITE, 1, &classObj, &uRet));
if (uRet)
{
TVariant vtSerialNumber;
OleCheck(classObj->Get(L"SerialNumber", 0, &vtSerialNumber, NULL, NULL));
strSerialNumber = vtSerialNumber;
}
return strSerialNumber.Trim();
} |
|
|
| 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.
|