Quiero escribir un programa usando VB6 o VC para leer el voltaje, la corriente, la temperatura y la capacidad de la batería de una computadora portátil.
HRESULT hr;
//1.Initialize COM
hr = CoInitializeEx(0, COINIT_MULTITHREADED); //inicializar COM
// 2. Inicialice la seguridad del proceso COM
hr = CoInitializeSecurity(
NULL, // Descriptor de seguridad
-1, // Negociación COM Servicio de autenticación
NULL, // Servicio de autenticación
NULL, // Reservado
RPC_C_AUTHN_LEVEL_DEFAULT, // El nivel de autenticación predeterminado del servidor proxy
RPC_C_IMP_LEVEL_IMPERSONATE, // Nivel de suplantación predeterminado del servidor proxy
NULL, // Información de autenticación
EOAC_NONE, // Capacidades adicionales del cliente o servidor
NULL); // Reservado
/3. Obtenga el localizador inicial de WMI.
//Inicialice la interfaz IWbemLocator
IWbemLocator *pLoc = 0
hr = CoCreateInstance(CLSID_WbemLocator, 0,
CLSCTX_ INPROC_SERVER, IID_IWbemLocator, (LPVOID *) & pLoc);
///4 Obtenga un puntero a IWbemServices en el espacio de nombres root\cimv2 en la computadora local llamando a IWbemLocator::ConnectServer. .
IWbemServices *pSvc = 0;
// Conéctese al espacio de nombres raíz\predeterminado utilizando el usuario actual. pSvc // Proxy de IWbemServices
);
cout lt;lt; "Conectado a WMI" lt;lt;
/5. proxy Configure la seguridad del proxy de IWbemServices para que los servicios WMI puedan suplantar al cliente llamando a CoSetProxyBlanket.
hr = CoSetProxyBlanket(pSvc, // Indica el proxy a configurar
RPC_C_AUTHN_WINNT, // RPC_C_AUTHN_xxx
RPC_C_AUTHZ_NONE, // RPC_C_AUTHZ_xxx
NULL,
RPC_C_AUTHN_LEVEL_CALL, // RPC_C_AUTHN_LEVEL_xxx
RPC_C_IMP_LEVEL_IMPERSONATE, // RPC_C_ IMP_LEVEL_xxx
NULL, // Identidad del cliente
EOAC_NONE );//Capacidades de proxy
//6. Utilice el puntero IWbemServices para realizar una solicitud a WMI.
IEnumWbemClassObject* pEnumerator = NULL;
hr = pSvc-gt; ExecQuery(
bstr_t("WQL"),
bstr_t ("SELECT * FROM Win32_Battery"),
WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
NULL,
amp;pEnumerator); FAILED( hr))
{
cout lt;lt; "Error en la consulta de procesos."
lt; "Código de error = 0x"
lt; lt hexadecimal; hr lt; lt;
pSvc-gt; );
CoUninitialize();
return 1; // El programa falló.
}
else
{
IWbemClassObject *pclsObj
ULONG uReturn = 0
ULONG i = 0;
mientras (pEnumerator)
{
hr = pEnumerator- gt; Next(WBEM_INFINITE, 1,
amp;pclsObj, amp;uReturn);
if(0 == uReturn)
{
printf("end\n") ;
romper;
}
VARIANT vtProp;
BSTR lp; //LPCWSTR
if( Strname[i][0] == "cadena")
{
lp = (BSTR)Strname[i][1].c_str();
// Obtener el valor del atributo Nombre
hr = pclsObj-gt Get(lp, 0, amp; vtProp, 0, 0);
printf(Strname[ i] [1].c_str());
wcout lt;lt; " : " lt;vtProp.bstrVal lt;endl;
VariantClear(amp; vtProp) ;
}
else
{
printf(Strname[i][ 1].c_str());
printf(":desconocido\n");
}
i;
}
}
}
}
// Limpieza
// ========
pSvc -gt ;Liberar();
pLoc-gt;Liberar();