本机 WMI 提供程序中的 UINT64 不会在某些系统上返回数据

Posted

技术标签:

【中文标题】本机 WMI 提供程序中的 UINT64 不会在某些系统上返回数据【英文标题】:UINT64 in Native WMI provider doesn't return data on certain systems 【发布时间】:2013-12-06 15:19:07 【问题描述】:

我在This tutorial on MSDN 之后创建了一个本机 WMI 提供程序。我的班级 MOF 与此类似:

[dynamic, provider("CacheProvider")]
class Cache

    [key]
    String Path;
    uint32 Type;
    uint64 MaxSize;
    uint64 Size;
    boolean Enabled;
;

所有数据都正确返回,除了 uint64 值。我已经读过,对于 uint64 值,您实际上需要将数据作为 BSTR 提供。它确实适用于我尝试过的 99% 的机器。我就是这样做的。

v.vt = VT_BSTR;
v.bstrVal = ToLongLongString(MaxSize);
sc = (*pNewInst)->Put(L"MaxSize", 0, &v, 0);
VariantClear(&v);

ToLongLongString 函数如下所示。

bstr_t ToLongLongString(LONGLONG llValue)

    wchar_t szValue[21];
    SecureZeroMemory(szValue, sizeof(szValue));
    swprintf_s(szValue, L"%lld", llValue);
    bstr_t bstrFormat(szValue);
    return bstrFormat;

我已验证此函数返回的字符串格式正确。只是似乎无论出于何种原因,它都没有通过 WMI 系统。我没有看到它在运行的唯一机器是 2012 R2 服务器。

【问题讨论】:

【参考方案1】:

从这里: http://msdn.microsoft.com/en-us/library/aa393262(v=vs.85).aspx

注意在 VBScript 等脚本语言中查询具有 uint64 或 sint64 数据类型的属性值时,WMI 会返回字符串值。比较这些值时可能会出现意外结果,因为比较字符串会返回与比较数字不同的结果。例如,比较字符串时“10000000000”小于“9”,比较数字时9小于10000000000。为避免混淆,当从 WMI 检索 uint64 或 sint64 类型的属性时,应在 VBScript 中使用 CDbl 方法。

您可以尝试使用 CDBL 吗?

【讨论】:

我尝试过使用 wbemtest 和 PowerShell。我没有运行任何 VBScript。它根本没有返回值。 wbemtest 报告 :\【参考方案2】:

问题在于我分配 BSTR 的方式。

由于 ToLongLongString 返回 bstr_t,它将 BSTR 值传递给变体。由于我从未将 BSTR 与 bstr_t 分离,因此一旦 bstr_t 超出范围,BSTR 就会被释放。

调用 Detach 解决了这个问题。

【讨论】:

以上是关于本机 WMI 提供程序中的 UINT64 不会在某些系统上返回数据的主要内容,如果未能解决你的问题,请参考以下文章

wmi hpqBIntM 提供程序 dll 位于何处?

x64 上的 WMI 链接器错误

数百万 UINT64 RGBZ 图形像素的最快排序算法

利用WMI获取本机基本信息

在 VS 中的 UINT64 上左移 (64 > shift > 32) 位仅移动 32 位

在连接本地WMI提供程序时出现错误 70。没有权限(Microsoft VBScript运行时错误