C++ 首次调用Windows性能计数器(PDH)有时会失败
我遇到了一个问题,有时我的代码可以正常运行,但有时它会失败 这是我运行的第一段与PDH相关的代码:C++ 首次调用Windows性能计数器(PDH)有时会失败,c++,windows,visual-studio,performance,C++,Windows,Visual Studio,Performance,我遇到了一个问题,有时我的代码可以正常运行,但有时它会失败 这是我运行的第一段与PDH相关的代码: const std::wstring pidWildcardPath = L"\\Process(*)\\ID Process"; DWORD bufferSize = 0; LPTSTR paths = NULL; PDH_STATUS status = PdhExpandCounterPath( pidWildcardPath.c_str(), paths, &
const std::wstring pidWildcardPath = L"\\Process(*)\\ID Process";
DWORD bufferSize = 0;
LPTSTR paths = NULL;
PDH_STATUS status = PdhExpandCounterPath(
pidWildcardPath.c_str(),
paths,
&bufferSize);
checkPDHStatus(status, PDH_MORE_DATA, L"Expected request for more data.");
PdhExpandCounterPath函数调用的结果是0x800007D0
(PDH\u CSTATUS\u NO\u MACHINE
)。checkPDHStatus
函数是我编写的一个简单函数,它断言状态等于第二个参数。在这种情况下,我希望结果是PDH\u MORE\u DATA,因为路径
是NULL
,bufferSize
是0
。此调用的目标是确定我必须分配的缓冲区大小,以存储对PdhExpandCounterPath
的后续调用的所有结果。PDH中备注部分对此进行了说明
“无法连接到指定的计算机,或者计算机处于脱机状态。”从上面代码中的性能计数器路径可以看出,我甚至没有尝试连接到与我自己的计算机不同的计算机
这段代码失败的方式很有趣。有时它可以正常工作,但有时它会在多次背靠背执行应用程序时失败。我的头文件中有#include
,并且我的属性页中有一个类似于以下内容的DLL部分:
<Tool
Name="VCLinkerTool"
AdditionalDependencies="pdh.lib"
/>
我不确定这是否重要,但这个程序是由VisualStudio2005构建的,运行在WindowsXP上。我做错什么了吗
我是Dave's的同事,在调查过程中发现了以下情况: 当从登录的交互式会话运行时,上面的代码运行良好 当作为计划任务启动时,代码运行正常,并且用户在启动计划任务时登录 仅当作为计划任务运行且用户在任务启动时未登录时,代码才会失败 如果用户在失败的任务启动后但仍在运行时登录,代码将继续失败(因为它“无休止地”循环,直到返回PDH_MORE_数据状态)。 在失败的实例中,尚未为程序建立/设置以下环境变量:APPDATA、HOMEDRIVE和HOMEPATH。。。我不认为这是个问题。然而,失败的程序也缺少其令牌的SeCreateGlobalPrivilege;传递的程序在令牌中都具有此权限,PERFMON将其显示为“默认启用”。另一个区别是失败的程序在令牌中有NT\U AUTH\BATCH user组,而通过的程序有NT\U AUTH\INTERACTIVE组。。。对于这两种情况,所有其他用户组和权限都相同。我认为全局权限来自交互式登录,但不知道它是否与PDH操作有任何关系 我在Performance Counter/PDH文档中找不到任何关于需要任何特殊权限或特权才能成功实现此功能的内容。使用性能计数器是否需要全局权限
或者,当用户在任务开始时登录/未登录时,运行计划任务(作为特定用户)之间是否存在其他上下文/环境差异,这将分别解释PDH调用成功/失败的原因?尝试此格式,指示本地计算机:
const std::wstring pidwidcardpath=L“\\.\Process(*)\ID Process” 你能试试这个“\\\\your computer name\\Process(*)\\ID Process”吗?看看你是否有同样的错误。还要检查运行代码的权限。@Simon Mourier:它只会失败,这一事实有时让我相信这不是权限问题。我也不知道如何检查代码的权限。