Chinaunix首页 | 论坛 | 博客
  • 博客访问: 249103
  • 博文数量: 83
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 410
  • 用 户 组: 普通用户
  • 注册时间: 2012-08-22 10:11
文章分类
文章存档

2016年(2)

2014年(2)

2013年(65)

2012年(14)

我的朋友

分类: C/C++

2013-01-21 16:48:32

原文地址:关于用WMI获取声卡信息 作者:pamire

#include "stdafx.h"
#define _WIN32_DCOM
#include
using namespace std;
#include
#include
# pragma comment(lib, "wbemuuid.lib")
int main(int argc, char **argv)
{
 HRESULT hres;
 // Step 1: --------------------------------------------------
 // Initialize COM. ------------------------------------------
 hres =  CoInitializeEx(0, COINIT_MULTITHREADED);
 if (FAILED(hres))
 {
  cout << "Failed to initialize COM library. Error code = 0x"
   << hex << hres << endl;
  return 1;                  // Program has failed.
 }
 // Step 2: --------------------------------------------------
 // Set general COM security levels --------------------------
 // Note: If you are using Windows 2000, you need to specify -
 // the default authentication credentials for a user by using
 // a SOLE_AUTHENTICATION_LIST structure in the pAuthList ----
 // parameter of CoInitializeSecurity ------------------------
 hres =  CoInitializeSecurity(
  NULL,
  -1,                          // COM authentication
  NULL,                        // Authentication services
  NULL,                        // Reserved
  RPC_C_AUTHN_LEVEL_DEFAULT,   // Default authentication
  RPC_C_IMP_LEVEL_IMPERSONATE, // Default Impersonation 
  NULL,                        // Authentication info
  EOAC_NONE,                   // Additional capabilities
  NULL                         // Reserved
  );

 if (FAILED(hres))
 {
  cout << "Failed to initialize security. Error code = 0x"
   << hex << hres << endl;
  CoUninitialize();
  return 1;                    // Program has failed.
 }
 // Step 3: ---------------------------------------------------
 // Obtain the initial locator to WMI -------------------------
 IWbemLocator *pLoc = NULL;
 hres = CoCreateInstance(
  CLSID_WbemLocator,            
  0,
  CLSCTX_INPROC_SERVER,
  IID_IWbemLocator, (LPVOID *) &pLoc);
 if (FAILED(hres))
 {
  cout << "Failed to create IWbemLocator object."
   << " Err code = 0x"
   << hex << hres << endl;
  CoUninitialize();
  return 1;                 // Program has failed.
 }
 // Step 4: -----------------------------------------------------
 // Connect to WMI through the IWbemLocator::ConnectServer method
 IWbemServices *pSvc = NULL;
 // Connect to the root\cimv2 namespace with
 // the current user and obtain pointer pSvc
 // to make IWbemServices calls.
 hres = pLoc->ConnectServer(
  _bstr_t(L"ROOT\\CIMV2"), // Object path of WMI namespace
  NULL,                    // User name. NULL = current user
  NULL,                    // User password. NULL = current
  0,                       // Locale. NULL indicates current
  NULL,                    // Security flags.
  0,                       // Authority (e.g. Kerberos)
  0,                       // Context object
  &pSvc                    // pointer to IWbemServices proxy
  );
 if (FAILED(hres))
 {
  cout << "Could not connect. Error code = 0x"
   << hex << hres << endl;
  pLoc->Release();    
  CoUninitialize();
  return 1;                // Program has failed.
 }
 cout << "Connected to ROOT\\CIMV2 WMI namespace" << endl;

 // Step 5: --------------------------------------------------
 // Set security levels on the proxy -------------------------
 hres = CoSetProxyBlanket(
  pSvc,                        // Indicates the proxy to set
  RPC_C_AUTHN_WINNT,           // RPC_C_AUTHN_xxx
  RPC_C_AUTHZ_NONE,            // RPC_C_AUTHZ_xxx
  NULL,                        // Server principal name
  RPC_C_AUTHN_LEVEL_CALL,      // RPC_C_AUTHN_LEVEL_xxx
  RPC_C_IMP_LEVEL_IMPERSONATE, // RPC_C_IMP_LEVEL_xxx
  NULL,                        // client identity
  EOAC_NONE                    // proxy capabilities
  );
 if (FAILED(hres))
 {
  cout << "Could not set proxy blanket. Error code = 0x"
   << hex << hres << endl;
  pSvc->Release();
  pLoc->Release();    
  CoUninitialize();
  return 1;               // Program has failed.
 }
 // Step 6: --------------------------------------------------
 // Use the IWbemServices pointer to make requests of WMI ----
 // For example, get the name of the operating system
 IEnumWbemClassObject* pEnumerator = NULL;
 hres = pSvc->ExecQuery(
  bstr_t("WQL"),
  //bstr_t("SELECT * FROM Win32_SoundDevice"),
  bstr_t("SELECT * FROM Win32_SoundDevice"),
  WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
  NULL,
  &pEnumerator);
 if (FAILED(hres))
 {
  cout << "Query for operating system name failed."
   << " Error code = 0x"
   << hex << hres << endl;
  pSvc->Release();
  pLoc->Release();
  CoUninitialize();
  return 1;               // Program has failed.
 }
 // Step 7: -------------------------------------------------
 // Get the data from the query in step 6 -------------------
 IWbemClassObject *pclsObj;
 ULONG uReturn = 0;
 while (pEnumerator)
 {
  HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1,
   &pclsObj, &uReturn);
  if(0 == uReturn)
  {
   break;
  }
  //VARIANT vtProp;
  //// Get the value of the Name property
  //hr = pclsObj->Get(L"Caption", 0, &vtProp, 0, 0);
  //wcout << " Caption : " << vtProp.bstrVal << endl;
  //hr = pclsObj->Get(L"Description", 0, &vtProp, 0, 0);
  //wcout << " Description : " << vtProp.bstrVal << endl;
  //hr = pclsObj->Get(L" Manufacturer", 0, &vtProp, 0, 0);
  //wcout << "  Manufacturer : " << vtProp.bstrVal << endl;
  //hr = pclsObj->Get(L"SystemName", 0, &vtProp, 0, 0);
  //wcout << " SystemName : " << vtProp.bstrVal << endl;
  //hr = pclsObj->Get(L"SystemCreationClassName", 0, &vtProp, 0, 0);
  //wcout << " SystemCreationClassName : " << vtProp.bstrVal << endl;
  //VariantClear(&vtProp);
  SAFEARRAY*pvNames=NULL ;
  if(pclsObj->GetNames(NULL,WBEM_FLAG_ALWAYS|WBEM_MASK_CONDITION_ORIGIN,NULL,&pvNames)==S_OK)
  {
   long vbl,vbu ;
   SafeArrayGetLBound(pvNames,1,&vbl);
   SafeArrayGetUBound(pvNames,1,&vbu);
   for(long idx=vbl;idx<=vbu;idx++)
   {
    long aidx=idx ;
    wchar_t *wsName=0 ;
    VARIANT vValue ;
    VariantInit(&vValue);
    SafeArrayGetElement(pvNames,&aidx,&wsName);
    BSTR bs=SysAllocString(wsName);
    hres=pclsObj->Get(bs,0,&vValue,NULL,0);
    SysFreeString(bs);

    if(SUCCEEDED(hres))
    {
     char szANSIString[MAX_PATH];
     WideCharToMultiByte(CP_ACP,WC_COMPOSITECHECK,wsName,-1,
      szANSIString,sizeof(szANSIString),NULL,NULL);
     wcout<     //wcout << vValue.bstrVal << endl;
     //VariantClear(&vValue);
     switch(vValue.vt)
     {
     case VT_BSTR :
      wprintf(L"%s",V_BSTR(&vValue));
      break ;
     case VT_I2 :
      wprintf(L"%d",V_I2(&vValue));
      break ;
     case VT_I4 :
      wprintf(L"%d",V_I4(&vValue));
      break ;
     case VT_BOOL :
      wprintf(L"%s",V_BOOL(&vValue)?L"TRUE":L"FALSE");
      break ;
     default:
      /*WCHAR tmp[100];
      wcscpy(tmp, V_BSTR(&vValue));
      char tmp1[MAX_PATH];
      WideCharToMultiByte(CP_ACP,WC_COMPOSITECHECK,tmp,-1,
      tmp1,sizeof(tmp1),NULL,NULL);
      cout<      break;
     }
     cout<    }
    SysFreeString(wsName);
   }
  }
 }
 // Cleanup
 // ========
 pSvc->Release();
 pLoc->Release();
 pEnumerator->Release();
 pclsObj->Release();
 CoUninitialize();
 return 0;   // Program successfully completed.
}
 
阅读(1708) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~