dll加载路径错误

This commit is contained in:
2025-06-08 17:40:21 +08:00
parent 232ba1a5ae
commit 2298e69a1c
84 changed files with 4749 additions and 241 deletions

View File

@ -0,0 +1,125 @@
#include <computer.h>
#include <IComputer.h>
#include <Visitor.h>
#include "include.h"
#include <iostream>
//回调函数在C#版本的DLL中我们需要实现IVisitor接口并将其引用传给Computer。
//由于没有办法在C++里实现C#接口考虑到IVisitor接口只包含函数因此我提供了IVisitor的默认实现
//其实现为调用以下四个回调函数它们的指针会被转换为C#委托供IVisitor的C#实现调用。
//注意!!哪怕提供空实现也要提供,要不然就不保证不出问题了。
void VisitComputerCallBack(IComputer& computer, Visitor* visitor)
{
computer.Traverse(visitor);
}
void VisitHardwareCallBack(Hardware& hardware, Visitor* visitor)
{
hardware.Update();
std::vector<Hardware> subHardwares = hardware.getSubHardware();
for (int i = 0; i < subHardwares.size(); i++) {
subHardwares[i].Accept(visitor);
}
}
void VisitSensorCallBack(Sensor& sensor, Visitor* visitor)
{
}
void VisitParameterCallBack(Parameter& parameter, Visitor* visitor)
{
}
void destroy(const Napi::CallbackInfo& info){
computer->Close();
computer=nullptr;
CoUninitialize();
}
// 使用智能指针管理资源
std::shared_ptr<Computer> computer;
std::shared_ptr<Visitor> visitor;
// 封装 COM 初始化/卸载
struct ComInitializer {
HRESULT hr;
ComInitializer() {
hr = CoInitializeEx(nullptr, COINIT_MULTITHREADED);
}
~ComInitializer() {
if (SUCCEEDED(hr)) {
CoUninitialize();
}
}
};
void log(std::string log) {
std::ofstream logfile;
logfile.open("native_module.log", std::ios::app);
logfile << log << std::endl;
logfile.close();
}
// 安全的初始化函数
Napi::Object init(Napi::Env env, Napi::Object exports) {
log("Com initing");
ComInitializer comInit; // RAII 管理 COM 生命周期
// 检查 COM 初始化结果
if (FAILED(comInit.hr)) {
log("Com init fail");
_com_error err(comInit.hr);
Napi::Error::New(env, err.ErrorMessage()).ThrowAsJavaScriptException();
return exports;
}
log("Com inited");
computer = std::make_shared<Computer>();
computer->setCpuEnabled(true);
computer->setGpuEnabled(true);
computer.setGpuEnabled(true);
computer.setMotherboardEnabled(true);
computer.setStorageEnabled(true);
computer.setBatteryEnabled(true);
computer.setControllerEnabled(true);
computer.setMemoryEnabled(true);
computer.setNetworkEnabled(true);
computer.setPsuEnabled(true);
computer->Open();
log("Computer inited");
visitor = std::make_shared<Visitor>();
visitor->setVisitComputerCallBack(VisitComputerCallBack);
visitor->setVisitHardwareCallBack(VisitHardwareCallBack);
visitor->setVisitParameterCallBack(VisitParameterCallBack);
visitor->setVisitSensorCallBack(VisitSensorCallBack);
visitor->commit();
computer->Accept(visitor.get()); // 传递原始指针
log("Visitor inited");
// 导出函数
exports.Set(Napi::String::New(env,"cpu_name"), Napi::Function::New(env, cpu_name));
exports.Set(Napi::String::New(env,"cpu_load"), Napi::Function::New(env, cpu_load));
exports.Set(Napi::String::New(env,"cpu_power"), Napi::Function::New(env, cpu_power));
exports.Set(Napi::String::New(env,"cpu_speed"), Napi::Function::New(env, cpu_speed));
exports.Set(Napi::String::New(env,"cpu_temperature"), Napi::Function::New(env, cpu_temperature));
exports.Set(Napi::String::New(env,"cpu_voltage"), Napi::Function::New(env, cpu_voltage));
exports.Set(Napi::String::New(env,"current_gpu_status"), Napi::Function::New(env, current_gpu_status));
exports.Set(Napi::String::New(env,"mem_clock"), Napi::Function::New(env, mem_clock));
exports.Set(Napi::String::New(env,"mem_free_size"), Napi::Function::New(env, mem_free_size));
exports.Set(Napi::String::New(env,"mem_used_size"), Napi::Function::New(env, mem_used_size));
exports.Set(Napi::String::New(env,"mem_name"), Napi::Function::New(env, mem_name));
exports.Set(Napi::String::New(env,"mem_size"), Napi::Function::New(env, mem_size));
exports.Set(Napi::String::New(env,"vmem_free_size"), Napi::Function::New(env, vmem_free_size));
exports.Set(Napi::String::New(env,"vmem_used_size"), Napi::Function::New(env, vmem_used_size));
exports.Set(Napi::String::New(env,"current_disk_used"), Napi::Function::New(env, current_disk_used));
exports.Set(Napi::String::New(env,"disk_name"), Napi::Function::New(env, disk_name));
exports.Set(Napi::String::New(env,"monitor_info"), Napi::Function::New(env, monitor_info));
exports.Set(Napi::String::New(env,"destroy"), Napi::Function::New(env, destroy));
log("Export inited");
return exports;
}
NODE_API_MODULE(hardware_monitor, init)