Files
hardwaremoniter/hardware_monitor_wrapper/native/memory.cpp
2025-06-08 17:40:21 +08:00

134 lines
4.6 KiB
C++

#include "include.h"
#pragma comment(lib, "wbemuuid.lib")
Napi::Value mem_used_size(const Napi::CallbackInfo& info){
Napi::Env env = info.Env();
for (Hardware hardware:computer->getHardware()){
if(hardware.getHardwareType()==HardwareType::Memory){
for(Sensor sen:hardware.getSensors()){
char *name=sen.getName();
if(sen.getType()==SensorType::Data && (strcmp(name, "Memory Used")==0)){
delete[] name;
return Napi::Number::New(env, sen.getValue());
}
delete[] name;
}
}
}
return env.Null();
}
Napi::Value vmem_used_size(const Napi::CallbackInfo& info){
Napi::Env env = info.Env();
for (Hardware hardware:computer->getHardware()){
if(hardware.getHardwareType()==HardwareType::Memory){
for(Sensor sen:hardware.getSensors()){
char *name=sen.getName();
if(sen.getType()==SensorType::Data && (strcmp(name, "Virtual Memory Used")==0)){
delete[] name;
return Napi::Number::New(env, sen.getValue());
}
delete[] name;
}
}
}
return env.Null();
}
Napi::Value mem_free_size(const Napi::CallbackInfo& info){
Napi::Env env = info.Env();
for (Hardware hardware:computer->getHardware()){
if(hardware.getHardwareType()==HardwareType::Memory){
for(Sensor sen:hardware.getSensors()){
char *name=sen.getName();
if(sen.getType()==SensorType::Data && (strcmp(name, "Memory Available")==0)){
delete[] name;
return Napi::Number::New(env, sen.getValue());
}
delete[] name;
}
}
}
return env.Null();
}
Napi::Value vmem_free_size(const Napi::CallbackInfo& info){
Napi::Env env = info.Env();
for (Hardware hardware:computer->getHardware()){
if(hardware.getHardwareType()==HardwareType::Memory){
for(Sensor sen:hardware.getSensors()){
char *name=sen.getName();
if(sen.getType()==SensorType::Data && (strcmp(name, "Virtual Memory Available")==0)){
delete[] name;
return Napi::Number::New(env, sen.getValue());
}
delete[] name;
}
}
}
return env.Null();
}
Napi::Value mem_clock(const Napi::CallbackInfo& info){
Napi::Env env = info.Env();
for (Hardware hardware:computer->getHardware()){
if(hardware.getHardwareType()==HardwareType::Memory){
for(Sensor sen:hardware.getSensors()){
if(sen.getType()==SensorType::Clock){
return Napi::Number::New(env, sen.getValue());
}
}
}
}
return env.Null();
}
Napi::Value mem_size(const Napi::CallbackInfo& info) {
Napi::Env env = info.Env();
HRESULT hr;
IWbemLocator* pLoc = nullptr;
hr = CoCreateInstance(CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID*)&pLoc);
IWbemServices* pSvc = nullptr;
hr = pLoc->ConnectServer(_bstr_t(L"ROOT\\CIMV2"), nullptr, nullptr, 0, NULL, 0, 0, &pSvc);
hr = CoSetProxyBlanket(pSvc, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, nullptr, RPC_C_AUTHN_LEVEL_CALL, RPC_C_IMP_LEVEL_IMPERSONATE, nullptr, EOAC_NONE);
// 查询总容量
IEnumWbemClassObject* pEnumerator = nullptr;
hr = pSvc->ExecQuery(_bstr_t(L"WQL"), _bstr_t(L"SELECT Capacity FROM Win32_PhysicalMemory"), WBEM_FLAG_FORWARD_ONLY, nullptr, &pEnumerator);
ULONG uReturn = 0;
IWbemClassObject* pObj = nullptr;
DWORD totalCapacity = 0;
while (pEnumerator->Next(WBEM_INFINITE, 1, &pObj, &uReturn) == S_OK) {
VARIANT vtCapacity;
hr = pObj->Get(L"Capacity", 0, &vtCapacity, nullptr, nullptr);
totalCapacity += vtCapacity.ullVal / (1024 * 1024 * 1024); // 转换为GB
VariantClear(&vtCapacity);
pObj->Release();
}
pSvc->Release();
pLoc->Release();
return Napi::Number::New(env, totalCapacity);
}
Napi::String mem_name(const Napi::CallbackInfo& info) {
Napi::Env env = info.Env();
for (Hardware hardware:computer->getHardware()){
if(hardware.getHardwareType()==HardwareType::Memory){
return Napi::String::New(env, hardware.Name());
}
}
return Napi::String::New(env, "");
}