- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用winapi-rs crate并尝试获取cpu的使用率,但是我什至无法做到这一点。
PdhCollectQueryData转换为十六进制时将返回“-2147481643”,然后错误代码为“0x800007D5(PDH_NO_DATA)没有要返回的数据。”这是我面临的问题。
有人可以帮助确定我做错了什么导致“x800007D5(PDH_NO_DATA)没有数据返回”吗?我可以在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(())
}
如果我打印出这些值,则在程序完成后返回的一些值的示例:
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)没有要返回的数据”。
最佳答案
这是使用 winapi
crate将C++示例转换为Rust的字面意思。
正如IInspectable在评论中所说,您需要添加一些错误处理,在这种情况下,我添加了一些assert_eq!
。
use std::ptr;
// winapi = { version = "0.3.9", features = ["pdh", "winerror"] }
use winapi::{ctypes::c_char, shared::winerror::ERROR_SUCCESS, um::pdh::*};
fn main() {
unsafe {
let mut cpu_query: PDH_HQUERY = ptr::null_mut();
let mut cpu_total: PDH_HCOUNTER = ptr::null_mut();
let err = PdhOpenQueryA(ptr::null(), 0, &mut cpu_query);
assert_eq!(err, ERROR_SUCCESS as i32);
let err = PdhAddCounterA(
cpu_query,
b"\\Processor(_Total)\\% Processor Time\0".as_ptr() as *const c_char,
0,
&mut cpu_total,
);
assert_eq!(err, ERROR_SUCCESS as i32);
let mut counter_val: PDH_FMT_COUNTERVALUE = std::mem::zeroed();
let err = PdhCollectQueryData(cpu_query);
assert_eq!(err, ERROR_SUCCESS as i32);
std::thread::sleep(std::time::Duration::from_millis(1000));
let err = PdhCollectQueryData(cpu_query);
assert_eq!(err, ERROR_SUCCESS as i32);
let err = PdhGetFormattedCounterValue(
cpu_total,
PDH_FMT_DOUBLE,
ptr::null_mut(),
&mut counter_val,
);
assert_eq!(err, ERROR_SUCCESS as i32);
println!("{:?}", counter_val.u.doubleValue());
}
}
关于winapi - WinAPI OpenQuery产生错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65467622/
我正在使用在 SQL Server 2005 上运行良好的 Openquey,我有 1 台服务器是 SQL Server 2008,但它无法正常工作。 如果我运行以下命令: SELECT * FROM
我有下面的 openquery,它工作正常,但现在我只想使用 gl_trans.gl_trans_date 选择事务 >= '2017-07-01' 但无法获取正确的语法。后台数据库为Informix
我想将数据从 MS SQL Server 数据库传输到 MySQL 数据库。因此,我向 MS SQL 添加了一个链接服务器,以便我可以使用 Openquery 将数据插入 MySQL 数据库。我想优化
我有一个链接到 MSSQL 服务器的 MySQL 服务器,我正在尝试将数据插入 MySQL 服务器上的表 admin_user,但最终出现错误: Cannot process the object "
如何使用表变量作为 OPENQUERY 的参数 就像是: DECLARE @TSQL VARCHAR(8000) DECLARE @VAR TABLE (VAR1 VARCHAR (2)) INSER
我们正在尝试迁移到 SQL Server 2014。有几种情况我们需要使用 OpenQuery 来返回动态结果。结果集会根据不同的输入参数而有所不同。它在 sql 2008R2 中工作,我需要让它继续
如何在sql openquery中使用参数,例如: SELECT * FROM OPENQUERY([NameOfLinkedSERVER], 'SELECT * FROM TABLENAME whe
我已经尝试过这段代码,但仍然出现以下错误,也许有人可以帮忙? UPDATE a SET a.MMDWNO = '21' FROM OPENQUERY(NMIIFLIB, 'se
我有带有链接 Sybase 服务器的 SQL Server 2008,并且我正在尝试使用 OPENQUERY 在 Sybase 服务器上执行存储过程。如果我有一个不带参数的存储过程,它会成功。如果我有
我正在编写一个脚本,该脚本应该在一堆服务器周围运行并从中选择一堆数据,包括本地服务器。选择我需要的数据所需的 SQL 非常复杂,所以我正在编写一种临时 View ,并使用 OPENQUERY 语句来获
我正在尝试学习 openquery。我有一个 MSSQL 服务器,它有一个链接服务器 MySQL_testing。现在我整个早上都在与 openquery 语法作斗争,我想这里可能有更聪明的人知道它是
我有两个数据库MSSQL和MYSQL 我想将数据从 MYSQL 传输到 MSSQL,因此我在它们之间创建了链接服务器 在这一步之前我没有任何问题 我编写了以下代码,用于从 MYSQL 获取数据并插入到
我有一个动态存储过程,它为 OpenQuery 创建 mdx 语句。因此,mdx 语句中的对象可能为空。在本例中,我想要返回一个空字符串。 通常,查询会正常工作,除非我选择 future 的日期,在这
我的 MSSQL 触发器: ALTER TRIGGER [dbo].[ioTrigger_dbo_vsolv_mst_tproddtchng] ON [dbo].[vsolv_mst_tproddtc
我有一个OPENQUERY语句 SELECT * FROM OPENQUERY (NETLINE, 'SELECT * FROM XCREW.CTNAISV_HOTEL
我正在尝试使用“OPENQUERY”从 MS SQL Server 将记录插入 MySQL 数据库,但我正在尝试做的是忽略重复键消息。因此,当查询遇到重复项时,请忽略它并继续。 我可以做些什么来忽略重
不确定,这是否应该在 Stack Overflow 或 DBA 部分进行。 我正在编写的程序有问题。我有一个变量,可以说: SET @name sysname --also tried to make
我目前每天使用以下数据仓库一个表: DROP TABLE mytable SELECT firstcolumn, secondcolumn INTO mytable FROM OPENQUERY (m
试图找出为什么两者之间存在如此显着的差异 从linkedserver..tablename中选择* 和 select * from openquery(linkedserver, select * f
我需要使用参数(例如@PickedDate)从链接服务器检索数据。如果我跳过 @A 和 @B,查询工作正常,但由于缺少单引号,它总是返回错误。请指教,谢谢。 查询: Declare @OPENQUER
我是一名优秀的程序员,十分优秀!