我在 C++ 中使用以下代码片段通过 WQL 查询Win32_TCPIPPrinterPort:
[ cut WMI init part, initialize security and stuff ]
IWbemClassObject* clsObj = NULL;
int numElems;
while((hRes = pEnumerator->Next(WBEM_INFINITE, 1, &clsObj, (ULONG*)&numElems)) != WBEM_S_FALSE)
{
VARIANT vRet;
VariantInit(&vRet);
if(SUCCEEDED(clsObj->Get(LPCWSTR("HostAddress"), 0, &vRet, NULL, NULL)))
{
printf("HostAddress VT: %d", vRet.vt);
}
VariantClear(&vRet);
}
clsObj->Release();
[...]
(错误检查和初始化已被删除)
上面的代码在 Windows 7 中运行没有任何问题并返回正确的VT_BSTR
. 但是 Windows XP 给出了一个VT_NULL
而不是VT_BSTR
forclsObj->Get(...
如果你做一个
wmic -U user%pass //WINXPHOST "SELECT HostAddress FROM Win32_TCPIPPrinterPort"
从网络上的另一台(显然是 Linux)机器调用它返回所有值就好了。
我也试过cscript prnport.vbs -l -s WINXPHOST
告诉我正确的值。
[ - - 编辑 - -]
有趣的是,我从这里获取了默认的 C++ WMI MSDN 示例:示例:获取 WMI 数据
我将WQL 更改bstr_t("SELECT * FROM Win32_TCPIPPrinterPort"),
为Step 7
// Get the value of the HostAddress property
hr = pclsObj->Get(L"HostAddress", 0, &vtProp, 0, 0);
wcout << " HostAddress : " << vtProp.bstrVal << endl;
VariantClear(&vtProp);
编译后,它会VT_BSTR
在 Windows 7 机器和VT_NULL
Windows XP 机器上运行并返回 a。
可能是一个错误?想法?