vc使用wmi例子

#define _WIN32_DCOM
#define _WIN32_WINNT   0X0500 

#include <iostream>
#include <comdef.h>
#include <conio.h>
#include "wbemidl.h"
#include "wmi.h"

#pragma comment(lib,"WbemUuid.lib")

using namespace std;

static IWbemLocator *pLoc = NULL;
static IWbemServices *pSvc = NULL;
static IEnumWbemClassObject* pEnumerator = NULL; 
static IWbemClassObject* pclsObj = NULL;

// http://www.pudn.com/downloads44/sourcecode/windows/system/detail148813.html
// http://www.qingfengju.com/article.asp?id=62
// http://blog.csdn.net/shiwei0124/article/details/4985790
// http://topic.csdn.net/u/20100623/15/ad7c592d-2548-4aae-8ca2-18065baf6566.html
// http://msdn.microsoft.com/en-us/library/aa389273(VS.85).aspx
int DisplayALL( )   
{   
    HRESULT hres;   
       
    cout << "Step 1: --------------------------------------------------" << endl;   
    cout << "Initialize COM. ------------------------------------------" << endl;   
       
    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.    
    }   
       
    cout << "Step 2: --------------------------------------------------" << endl;   
    cout << "Set general COM security levels --------------------------" << endl;   
    cout << "Note: If you are using Windows 2000, you need to specify -" << endl;   
    cout << "the default authentication credentials for a user by using" << endl;   
    cout << "a SOLE_AUTHENTICATION_LIST structure in the pAuthList ----" << endl;   
    cout << "parameter of CoInitializeSecurity ------------------------" << endl;   
       
    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.    
    }   
       
    cout << "Step 3: ---------------------------------------------------" << endl;   
    cout << "Obtain the initial locator to WMI -------------------------" << endl;   
       
    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.    
    }   
       
    cout << "Step 4: -----------------------------------------------------" << endl;   
    cout << "Connect to WMI through the IWbemLocator::ConnectServer method" << endl;   
       
    IWbemServices *pSvc = NULL;   
       
    cout << "Connect to the root\\cimv2 namespace with" << endl;   
    cout << "the current user and obtain pointer pSvc" << endl;   
    cout << "to make IWbemServices calls." << endl;   
       
    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;   
       
       
    cout << "Step 5: --------------------------------------------------" << endl;   
    cout << "Set security levels on the proxy -------------------------" << endl;   
       
    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.    
    }   
       
    cout << "Step 6: --------------------------------------------------" << endl;   
    cout << "Use the IWbemServices pointer to make requests of WMI ----" << endl;   
       
    // 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_Product"),	
//			bstr_t("SELECT * FROM Win32_Registry"),								// 注册表
//			bstr_t("SELECT * FROM Win32_OnBoardDevice"),						// 主板上的嵌入设备
//			bstr_t("SELECT * FROM Win32_MotherboardDevice"),					// 母板
//			bstr_t("SELECT * FROM Win32_BaseBoard"),							// 主板
//			bstr_t("SELECT * FROM Win32_DMAChannel"),							// DMA通道
//			bstr_t("SELECT * FROM Win32_Bus"),									// 总线
//			bstr_t("SELECT * FROM Win32_BIOS"),									// BIOS系统
//			bstr_t("SELECT * FROM Win32_SystemBIOS"),
//			bstr_t("SELECT * FROM Win32_Processor"),							// 处理器
//			bstr_t("SELECT * FROM Win32_SystemProcesses"),						// 
//			bstr_t("SELECT * FROM Win32_Process"),								// 系统进程
//			bstr_t("SELECT * FROM Win32_Thread"),								// 系统线程
//			bstr_t("SELECT * FROM Win32_AssociatedProcessorMemory"),			// CACHE
//			bstr_t("SELECT * FROM Win32_CacheMemory"),							// 二级缓存内存
//			bstr_t("SELECT * FROM Win32_PhysicalMedia"),						// 物理媒体信息 (硬盘)
//			bstr_t("SELECT * FROM Win32_LogicalDisk "),							// 逻辑驱动器
//			bstr_t("SELECT * FROM Win32_DiskDrive"),							// 磁盘驱动器
//			bstr_t("SELECT * FROM Win32_MemoryDevice"),							// 内存设备
//			bstr_t("SELECT * FROM Win32_PhysicalMemoryArray"),					// 物理内存数组
//			bstr_t("SELECT * FROM Win32_PhysicalMemoryLocation"),				// 物理内存位置
//			bstr_t("SELECT * FROM CIM_NumericSensor"),							// 数字传感器
//			bstr_t("SELECT * FROM Win32_VoltageProbe"),							// 数字传感器 
//			bstr_t("SELECT * FROM Win32_TemperatureProbe"),						// 温度传感器
//			bstr_t("SELECT * FROM Win32_CurrentProbe"),		
//			bstr_t("SELECT * FROM Win32_OperatingSystem"),						// 操作系统    
//			bstr_t("SELECT * FROM Win32_UserAccount"),							// 用户账号
//			bstr_t("SELECT * FROM Win32_SerialPort"),							// 串行接口
//			bstr_t("SELECT * FROM Win32_ParallelPort"),							// 并行接口
//			bstr_t("SELECT * FROM Win32_SCSIController"),						// 小型计算机系统接口
//			bstr_t("SELECT * FROM Win32_PortResource"),							// I/O 端口
//			bstr_t("SELECT * FROM Win32_PNPDevice"),							// 即插即用设备
//			bstr_t("SELECT * FROM Win32_NetworkAdapter"),						// 网络适配器
//			bstr_t("SELECT * FROM Win32_NetworkAdapterConfiguration"),
//			bstr_t("SELECT * FROM Win32_NetworkAdapterSetting"),
//			bstr_t("SELECT * FROM Win32_AssociatedBattery"),
//			bstr_t("SELECT * FROM Win32_Battery"),								// 内部电池
//			bstr_t("SELECT * FROM Win32_PortableBattery"),
//			bstr_t("SELECT * FROM Win32_PowerManagementEvent"),
//			bstr_t("SELECT * FROM Win32_UninterruptiblePowerSupply"),
//			bstr_t("SELECT * FROM Win32_DriverForDevice"),
//			bstr_t("SELECT * FROM Win32_Printer"),								// 打印机
//			bstr_t("SELECT * FROM Win32_TCPIPPrinterPort"),
//			bstr_t("SELECT * FROM Win32_POTSModem"),
//			bstr_t("SELECT * FROM Win32_DesktopMonitor"),						// 显示器
			bstr_t("SELECT * FROM Win32_VideoController"),						// 显卡
//			bstr_t("SELECT * FROM Win32_CDROMDrive"),
//			bstr_t("SELECT * FROM Win32_Keyboard"),								// 键盘
//			bstr_t("SELECT * FROM Win32_AutochkSetting"),
//			bstr_t("SELECT * FROM Win32_PointingDevice"),						// 点击设备:鼠标、触摸板
//			bstr_t("SELECT * FROM Win32_Fan"),									// 风扇
//			bstr_t("SELECT * FROM Win32_WMISetting"),
//			bstr_t("SELECT * FROM Win32_TimeZone"),		
//			bstr_t("SELECT * FROM Win32_Environment"),	  						// 环境路径
//			bstr_t("SELECT * FROM Win32_QuotaSetting"),
//			bstr_t("SELECT * FROM Win32_NetworkProtocol"),						// 己安装的网络协议
			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.    
    }   
       
    cout << "Step 7: -------------------------------------------------" << endl;   
    cout << "Get the data from the query in step 6 -------------------" << endl;   
       
    IWbemClassObject* pclsObj = NULL;   
    ULONG uReturn = 0;   
   
    while (pEnumerator)   
    {   
        cout << "pEnumerator==>" << pEnumerator << endl;   
        HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn);   
        cout << "pclsObj==>" << pclsObj << " NO. object found" << endl;   
        if ((0 == uReturn) || (0 == pclsObj))   
        {   
            break;   
        }   
   
        VARIANT vtProp;         
           
       // Get the value of the Name property    
		VariantInit(&vtProp); 
		vtProp.bstrVal = 0;// NULL
       // hr = pclsObj->Get(L"MACAddress", 0, &vtProp, 0, 0);   
		 hr = pclsObj->GetObjectText(0, &vtProp.bstrVal);
        if (vtProp.bstrVal != 0)   
        {   
		  	wcout.imbue(locale(locale(""),"",LC_CTYPE));
            wcout << L"硬件信息: " << vtProp.bstrVal << endl;   
        }   
        else   
        {   
            cout << "硬件信息 " << "vtProp.bstrVal == NULL" << endl;   
        }
		  VariantClear(&vtProp);   
    }   
       
    cout << "Cleanup" << endl;   
    // ========    
       
    pSvc->Release();   
    pLoc->Release();   
    if (pEnumerator)   
    {   
        pEnumerator->Release();   
    }   
    if (pclsObj)   
    {   
        pclsObj->Release();   
    }   
    CoUninitialize();   
       
    cout << "end of program" << endl;   
       
    return 0;   // Program successfully completed.    
       
}   




int main(int argc, char **argv)  
{
//	DisplayALL(); return 0;

	int p = Step1()?1:Step2()?1:Step3()?1:Step4()?1:Step5();
	// 下面可能错误,编译器优化,先算其中某一步为0,不再算其它
//	int p = Step1() & Step2() & Step3() & Step4() & Step5(); 
	if (p) goto ExitProgram;

	// 网卡
	p = Step6("SELECT * FROM Win32_NetworkAdapter");
	if (p) goto ExitProgram;
	{
		unsigned short MACAddress[MAX_PATH] = {0};
		p = Step7(L"NetConnectionID", L"本地连接", L"MACAddress", MACAddress);
		if (MACAddress[0] != 0)   
		{   
			wcout.imbue(locale(locale(""),"",LC_CTYPE));
			wcout << L"网卡地址: " << MACAddress << endl;   
		}  
	}

	// CPU
	p = Step6("SELECT * FROM Win32_Processor");
	if (p) goto ExitProgram;
	{
		unsigned short ProcessorId[MAX_PATH] = {0};
		p = Step7(L"DeviceID", L"CPU0", L"ProcessorId", ProcessorId);
		if (ProcessorId[0] != 0)   
		{   
			wcout.imbue(locale(locale(""),"",LC_CTYPE));
			wcout << L"处理器ID: " << ProcessorId << endl;   
		}  
	}

	// 硬盘
	p = Step6("SELECT * FROM Win32_PhysicalMedia");
	if (p) goto ExitProgram;
	{
		unsigned short SerialNumber[MAX_PATH] = {0};
		p = Step7(L"SerialNumber", SerialNumber);
		if (SerialNumber[0] != 0)   
		{   
			wcout.imbue(locale(locale(""),"",LC_CTYPE));
			wcout << L"硬盘序列号: " << SerialNumber << endl;   
		} 
	}

	// 显卡
	p = Step6("SELECT * FROM Win32_VideoController");
	if (p) goto ExitProgram;
	{
		unsigned short PNPDeviceID[MAX_PATH] = {0};
		p = Step7(L"PNPDeviceID", PNPDeviceID);
		if (PNPDeviceID[0] != 0)   
		{   
			wcout.imbue(locale(locale(""),"",LC_CTYPE));
			wcout << L"显卡序列号: " << PNPDeviceID << endl;   
		} 
	}

	// 操作系统
	p = Step6("SELECT * FROM Win32_OperatingSystem");
	if (p) goto ExitProgram;
	{
		unsigned short SerialNumber[MAX_PATH] = {0};
		p = Step7(L"SerialNumber", SerialNumber);
		if (SerialNumber[0] != 0)   
		{   
			wcout.imbue(locale(locale(""),"",LC_CTYPE));
			wcout << L"操作系统ID: " << SerialNumber << endl;   
		} 
	}

	 pSvc->Release();
    pLoc->Release();     

ExitProgram:
	Step8();
	getch();
	return 0;
}










int Step1()
{ 
	HRESULT hres;   
       
 //   cout << "Step 1: --------------------------------------------------" << endl;   
 //   cout << "Initialize COM. ------------------------------------------" << endl;   
       
    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.    
    }   
	return 0;
}
int Step2()
{ 
//	cout << "Step 2: --------------------------------------------------" << endl;   
//    cout << "Set general COM security levels --------------------------" << endl;   
//    cout << "Note: If you are using Windows 2000, you need to specify -" << endl;   
//    cout << "the default authentication credentials for a user by using" << endl;   
//    cout << "a SOLE_AUTHENTICATION_LIST structure in the pAuthList ----" << endl;   
 //   cout << "parameter of CoInitializeSecurity ------------------------" << endl;   
    HRESULT hres;  

    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.    
    }   
	return 0;
}
int Step3()
{ 
//	cout << "Step 3: ---------------------------------------------------" << endl;   
 //   cout << "Obtain the initial locator to WMI -------------------------" << endl;   
       
 //   IWbemLocator *pLoc = NULL;   
    HRESULT hres;  

    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.    
    }   
	return 0;
}
int Step4()
{ 
//	cout << "Step 4: -----------------------------------------------------" << endl;   
  //  cout << "Connect to WMI through the IWbemLocator::ConnectServer method" << endl;   
       
 //   IWbemServices *pSvc = NULL;   
       
 //   cout << "Connect to the root\\cimv2 namespace with" << endl;   
 //   cout << "the current user and obtain pointer pSvc" << endl;   
  //  cout << "to make IWbemServices calls." << endl;   
    HRESULT hres;  
	
    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;   
	return 0;
}
int Step5()
{ 
//	cout << "Step 5: --------------------------------------------------" << endl;   
//  cout << "Set security levels on the proxy -------------------------" << endl;   
    HRESULT hres;  
	
    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.    
    }  
	return 0;
}
int Step6(char *CmdString)
{ 
//	cout << "Step 6: --------------------------------------------------" << endl;   
//  cout << "Use the IWbemServices pointer to make requests of WMI ----" << endl;   
       
    // For example, get the name of the operating system    
//  IEnumWbemClassObject* pEnumerator = NULL;   
    HRESULT hres;  

	hres = pSvc->ExecQuery(   
			bstr_t("WQL"),
			bstr_t(CmdString),
			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.    
    }   
	return 0;
}
int Step7(unsigned short *Item1, unsigned short *content1, 
		  unsigned short *Item2, unsigned short *content2)
{ 
//	cout << "Step 7: -------------------------------------------------" << endl;   
 //   cout << "Get the data from the query in step 6 -------------------" << endl;   
       
//  IWbemClassObject* pclsObj = NULL;   
    ULONG uReturn = 0;   
   
    while (pEnumerator)   
    {   
//        cout << "pEnumerator==>" << pEnumerator << endl;   
        HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn);   
//        cout << "pclsObj==>" << pclsObj << " NO. object found" << endl;   
        if ((0 == uReturn) || (0 == pclsObj))   
        {   
            break;   
        }   
   
        VARIANT vtProp;         
           
        // Get the value of the Name property    
		// 名称
		VariantInit(&vtProp); 
		vtProp.bstrVal = 0;// NULL
		hr = pclsObj->Get(Item1, 0, &vtProp, 0, 0);

		if(hr != WBEM_S_NO_ERROR || vtProp.bstrVal == 0 || wcscmp(vtProp.bstrVal, content1) != 0) 
		{	
			VariantClear(&vtProp);
			continue;
		}
		VariantClear(&vtProp);

		VariantInit(&vtProp); 
		vtProp.bstrVal = 0;// NULL
        hr = pclsObj->Get(Item2, 0, &vtProp, 0, 0);   
		 // hr = pclsObj->GetObjectText(0, &vtProp.bstrVal);
        if (vtProp.bstrVal != 0)   
        {   
//		  	wcout.imbue(locale(locale(""),"",LC_CTYPE));
//          wcout << L"硬件信息: " << vtProp.bstrVal << endl;   
			wcscpy(content2, vtProp.bstrVal);
        }   
        else   
        {   
            cout << "硬件信息 " << "vtProp.bstrVal == NULL" << endl;   
        }
		  VariantClear(&vtProp);   
    }      
	return 0;
}
int Step7(unsigned short *Item, unsigned short *content)
{ 
//	cout << "Step 7: -------------------------------------------------" << endl;   
 //   cout << "Get the data from the query in step 6 -------------------" << endl;   
       
//  IWbemClassObject* pclsObj = NULL;   
    ULONG uReturn = 0;   
   
    while (pEnumerator)   
    {   
//      cout << "pEnumerator==>" << pEnumerator << endl;   
        HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1, &pclsObj, &uReturn);   
//        cout << "pclsObj==>" << pclsObj << " NO. object found" << endl;   
        if ((0 == uReturn) || (0 == pclsObj))   
        {   
            break;   
        }   
   
        VARIANT vtProp;         
           
        // Get the value of the Name property    
		  // 名称
		  VariantInit(&vtProp); 
		  vtProp.bstrVal = 0;// NULL
        hr = pclsObj->Get(Item, 0, &vtProp, 0, 0);   
		 // hr = pclsObj->GetObjectText(0, &vtProp.bstrVal);
        if (vtProp.bstrVal != 0)   
        {   
//		  	wcout.imbue(locale(locale(""),"",LC_CTYPE));
//          wcout << L"硬件信息: " << vtProp.bstrVal << endl;   
			wcscpy(content, vtProp.bstrVal);
        }   
        else   
        {   
            cout << "硬件信息 " << "vtProp.bstrVal == NULL" << endl;   
        }
		  VariantClear(&vtProp);   
    }      
	return 0;
}
int Step8()
{
//  cout << "Cleanup" << endl;   
    // ========    
    if (pEnumerator)   
    {   
        pEnumerator->Release();   
    }   
    if (pclsObj)   
    {   
        pclsObj->Release();   
    }
	 CoUninitialize(); 
       
//  cout << "end of program" << endl;
	return 0;
}

例子:http://download.csdn.net/detail/jiftlixu/4236349

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值