本机 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 报告问题在于我分配 BSTR 的方式。
由于 ToLongLongString 返回 bstr_t,它将 BSTR 值传递给变体。由于我从未将 BSTR 与 bstr_t 分离,因此一旦 bstr_t 超出范围,BSTR 就会被释放。
调用 Detach 解决了这个问题。
【讨论】:
以上是关于本机 WMI 提供程序中的 UINT64 不会在某些系统上返回数据的主要内容,如果未能解决你的问题,请参考以下文章