【发布时间】:2021-04-04 15:14:40
【问题描述】:
我正在使用winapi-rs crate 并尝试获取 cpu 使用率,但我什至无法做到这一点。
PdhCollectQueryData 在转换十六进制时返回“-2147481643”,然后错误代码是“0x800007D5 (PDH_NO_DATA) 没有数据返回。”这是我面临的问题。
有人可以帮助确定我做错了什么导致“x800007D5 (PDH_NO_DATA) No data to return”吗?我可以在 C++ 中使用它(下面提供的代码),但是在尝试将其转换为 Rust 代码时,它一点也不顺利。
use wmi::{COMLibrary, Variant, WMIConnection};
use std::{collections::HashMap, ptr::null};
use winapi::{ctypes::{c_char, c_void},um::{pdh::*, winnt::{LPCSTR}}};
#[cfg(windows)]
fn main() -> Result<(), Box<dyn std::error::Error>> {
const CPU_TIME: LPCSTR = "\\Processor(_Total)\\% Processor Time".as_ptr() as *const i8;
unsafe
{
//cpuQuery
let mut hquery: PDH_HQUERY = std::ptr::null_mut();
let hquery_address: *mut PDH_HQUERY = &mut hquery as *mut *mut _ as *mut *mut c_void;
//cpuCounter
let mut hcounter: PDH_HCOUNTER = std::ptr::null_mut();
let hcounter_address: *mut PDH_HCOUNTER = &mut hcounter as *mut *mut _ as *mut *mut c_void;
//open query
PdhOpenQueryA(null(), 0, hquery_address);
PdhAddCounterA(hquery, CPU_TIME, 0, hcounter_address);
PdhCollectQueryData(hquery);
}
Ok(())
}
如果我 println 值,程序完成后某些值返回的示例:
hquery: 0x2541b495e00
hquery_address: 0xce3dafef00
PdhOpenQueryA: 0
PdhCollectQueryData -2147481643
工作 C++ 代码(取自另一个 Stack Overflow 答案,运行时运行良好)
#include <TCHAR.h>
#include <pdh.h>
#include <windows.h>
#include <stdio.h>
#include <iostream>
#include <chrono>
#include <thread>
#pragma comment(lib, "pdh.lib")
using namespace std;
static PDH_HQUERY cpuQuery;
static PDH_HCOUNTER cpuTotal = NULL;
int _tmain(int argc, _TCHAR* argv[])
{
PdhOpenQuery(NULL, NULL, &cpuQuery);
PdhAddCounter(cpuQuery, L"\\Processor(_Total)\\% Processor Time", NULL, &cpuTotal);
PDH_FMT_COUNTERVALUE counterVal;
PdhCollectQueryData(cpuQuery);
this_thread::sleep_for(chrono::milliseconds(1000));
PdhCollectQueryData(cpuQuery);
PdhGetFormattedCounterValue(cpuTotal, PDH_FMT_DOUBLE, NULL, &counterVal);
cout << counterVal.doubleValue << "\n";
getchar();
}
所以,当 C++ 代码运行时,计数器就在那里。查询收集的 rust 代码无法正常工作并产生“x800007D5 (PDH_NO_DATA) No data to return.”,我做错了什么??
【问题讨论】:
-
我确实已将其全部转换,但删除了其中的一部分,直到我得到产生第一个错误 PdhCollectQueryData(hquery) 的代码。 PdhCollectQueryData(hquery) 给出错误代码:0x800007D5 (PDH_NO_DATA) 没有数据返回,我无法弄清楚为什么会这样。我已经更新了这个问题,希望让它更清楚,我的错:)
-
任何地方都没有错误处理或错误报告。这在 C++ 中已经是错误的了,而且最肯定地违背了 Rust 所代表的任何东西。移植糟糕的 C++ 代码的第一步通常是添加错误报告。
-
@IInspectable 是的,我明白,C++ 代码不是很好,我从不同的 SO 答案中获取它,因为我只是想看看我是否可以让它工作。肯定会通过错误处理来清理 Rust 代码,道歉。