0

我在 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_BSTRforclsObj->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_NULLWindows XP 机器上运行并返回 a。

可能是一个错误?想法?

4

0 回答 0