Mình cũng ko biết phải đặt tên topic thế nào cho chính xác.

Hiện tại gh+ đang gặp 1 vấn đề nho nhỏ như sau:

gh+ sử dụng WMI để lấy 1 số thông thông tin của NetworkApdaper. Nhưng ko biết phải làm thế nào để cập nhật lại giá trị cho nó

đây là đoạn code mà mình gõ viết


Mã:
int main(){    // Bước 1: Khởi tạo     HRESULT hres;    ULONG uReturn = 0;    VARIANT val;    WCHAR szDeviceId[255];    WCHAR szIntanceName[255];      hres = CoInitializeEx(0, COINIT_MULTITHREADED);     if (FAILED(hres))    {        MessageBox(0, L"Failed to initialize COM library.", 0, MB_ICONERROR);        return 0;                  // Program has failed.    }     hres = CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_DEFAULT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL );                        if (FAILED(hres))    {        MessageBox(0, L"Failed to initialize security.", 0, MB_ICONERROR);        CoUninitialize();        return 0;                    // Program has failed.    }     // Bước 2: Thiết lập     IWbemLocator *pLoc = NULL;     hres = CoCreateInstance(CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID *) &pLoc);     if (FAILED(hres))    {        MessageBox(0, L"Failed to create IWbemLocator object.", 0, MB_ICONERROR);        CoUninitialize();        return 0;                 // Program has failed.    }     // Bước 3: Kết nối     IWbemServices *pSvc_CIMV2 = NULL;        hres = pLoc->ConnectServer(_bstr_t(L"ROOT\\CIMV2"), NULL, NULL, 0, NULL, 0, 0, &pSvc_CIMV2);        if (FAILED(hres))    {        MessageBox(0, L"Could not connect to ROOT\\CIMV2 WMI namespace.", 0, MB_ICONERROR);        if (pLoc) pLoc->Release();        CoUninitialize();        return 0;      }     // Proxy    hres = CoSetProxyBlanket(pSvc_CIMV2, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, NULL, RPC_C_AUTHN_LEVEL_CALL, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE );     if (FAILED(hres))    {         MessageBox(0, L"Could not set proxy blanket.", 0, MB_ICONERROR);        if (pSvc_CIMV2) pSvc_CIMV2->Release();        if (pLoc) pLoc->Release();        CoUninitialize();       return 0;      }     // Bước 4: Truy vấn     IEnumWbemClassObject* pEnum_NetworkAdapter = NULL;     hres = pSvc_CIMV2->ExecQuery(bstr_t("WQL"), bstr_t("SELECT * FROM Win32_NetworkAdapter WHERE AdapterTypeId = 0"),        WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnum_NetworkAdapter);        if (FAILED(hres))    {        MessageBox(0, L"Query for operating system name failed (Win32_NetworkAdapter).", 0, MB_ICONERROR);        if (pSvc_CIMV2) pSvc_CIMV2->Release();        if (pLoc) pLoc->Release();        CoUninitialize();        return 0;      }     // Bước 5: Duyệt kết quả     IWbemClassObject *pObj_NetworkAdapter;       while (pEnum_NetworkAdapter)    {        HRESULT hr = pEnum_NetworkAdapter->Next(WBEM_INFINITE, 1, &pObj_NetworkAdapter, &uReturn);        if(uReturn == 0) break;                hr = pObj_NetworkAdapter->Get(L"Name", 0, &val, 0, 0);        wprintf(L"NIC Name: %s
", val.bstrVal);         hr = pObj_NetworkAdapter->Get(L"PNPDeviceID", 0, &val, 0, 0);        wprintf(L"PNPDeviceID: %s

", val.bstrVal);         // Lưu giữ lại giá trị của PNPDeviceID        wcscpy(szDeviceId, val.bstrVal);        int nLen = wcslen(szDeviceId);        UPCASE(szDeviceId);          /*************************** Truy vấn lồng *************************/         // Bước 5.1: Kết nối         IWbemServices *pSvc_WMI = NULL;                hres = pLoc->ConnectServer(_bstr_t(L"ROOT\\WMI"), NULL, NULL, 0, NULL, 0, 0, &pSvc_WMI);                if (FAILED(hres))        {            MessageBox(0, L"Could not connect to ROOT\\WMI namespace.", 0, MB_ICONERROR);            if (pLoc) pLoc->Release();            CoUninitialize();            return 0;          }                // Proxy        hres = CoSetProxyBlanket(pSvc_WMI, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, NULL, RPC_C_AUTHN_LEVEL_CALL, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE );         if (FAILED(hres))        {             MessageBox(0, L"Could not set proxy blanket.", 0, MB_ICONERROR);            if (pSvc_WMI) pSvc_WMI->Release();            if (pLoc) pLoc->Release();            CoUninitialize();           return 0;          }         // Bước 5.2: Truy vấn: MSPower_DeviceWakeEnable =========================================         IEnumWbemClassObject* pEnum_DeviceWakeEnable = NULL;         hres = pSvc_WMI->ExecQuery(bstr_t("WQL"), bstr_t("SELECT * FROM MSPower_DeviceWakeEnable"),            WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnum_DeviceWakeEnable);                if (FAILED(hres))        {            MessageBox(0, L"Query for operating system name failed (MSPower_DeviceWakeEnable).", 0, MB_ICONERROR);            if (pSvc_WMI) pSvc_WMI->Release();            if (pLoc) pLoc->Release();            CoUninitialize();            return 0;          }         // Bước 5.3: Duyệt kết quả         IWbemClassObject *pObj_DeviceWakeEnable;               while (pEnum_DeviceWakeEnable)        {            HRESULT hr = pEnum_DeviceWakeEnable->Next(WBEM_INFINITE, 1, &pObj_DeviceWakeEnable, &uReturn);            if(uReturn == 0) break;                        hr = pObj_DeviceWakeEnable->Get(L"Instancename", 0, &val, 0, 0);            wprintf(L"+ Instance Name: %s
", val.bstrVal);                        wcsncpy(szIntanceName, val.bstrVal, nLen);            szIntanceName[nLen] = 0;            UPCASE(szIntanceName);             hr = pObj_DeviceWakeEnable->Get(L"Enable", 0, &val, 0, 0);            wprintf(L" -> Enable [Boolean]: %d
", val.boolVal);             VariantClear(&val);             // Hehe ! Đây rồi            if (wcscmp(szDeviceId, szIntanceName) == 0)            {                 //MessageBox(0, L"OK", 0, 0);                 VARIANT v;                 VariantInit(&v);                V_VT(&v) = VT_BOOL;                V_BOOL(&v) = 0;                 // Tại sao đoạn này ko có tác dụng                HRESULT h = pObj_DeviceWakeEnable->Put(L"Enable", 0, &v, CIM_BOOLEAN);                 //switch (h)                //{                //  case WBEM_E_FAILED: printf("WBEM_E_FAILED"); break;                //  case WBEM_E_INVALID_PARAMETER: printf("WBEM_E_INVALID_PARAMETER"); break;                //  case WBEM_E_OUT_OF_MEMORY: printf("WBEM_E_OUT_OF_MEMORY"); break;                //  case WBEM_E_TYPE_MISMATCH: printf("WBEM_E_TYPE_MISMATCH"); break;                //  case WBEM_S_NO_ERROR: printf("WBEM_S_NO_ERROR"); break;                 //}                 //MessageBox(0, L"OK", 0, 0);                 VariantClear(&v);             }              if (pObj_DeviceWakeEnable) pObj_DeviceWakeEnable->Release();        }                 if (pEnum_DeviceWakeEnable) pEnum_DeviceWakeEnable->Release();          printf("  -----
");         // Bước 5.4: Truy vấn: MSNdis_DeviceWakeOnMagicPacketOnly =========================================         IEnumWbemClassObject* pEnum_MagicPacketOnly = NULL;         hres = pSvc_WMI->ExecQuery(bstr_t("WQL"), bstr_t("SELECT * FROM MSNdis_DeviceWakeOnMagicPacketOnly"),            WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &pEnum_MagicPacketOnly);                if (FAILED(hres))        {            MessageBox(0, L"Query for operating system name failed (MSNdis_DeviceWakeOnMagicPacketOnly).", 0, MB_ICONERROR);            if (pSvc_WMI) pSvc_WMI->Release();            if (pLoc) pLoc->Release();            CoUninitialize();            return 0;          }         // Bước 5.3: Duyệt kết quả         IWbemClassObject *pObj_MagicPacketOnly;               while (pEnum_MagicPacketOnly)        {            HRESULT hr = pEnum_MagicPacketOnly->Next(WBEM_INFINITE, 1, &pObj_MagicPacketOnly, &uReturn);            if(uReturn == 0) break;                        hr = pObj_MagicPacketOnly->Get(L"InstanceName", 0, &val, 0, 0);            wprintf(L"  Instance Name: %s
", val.bstrVal);             wcsncpy(szIntanceName, val.bstrVal, nLen);            szIntanceName[nLen] = 0;            UPCASE(szIntanceName);             // Hehe! Đây rồi            if (wcscmp(szDeviceId, szIntanceName) == 0)            {                }             if (pObj_MagicPacketOnly) pObj_MagicPacketOnly->Release();        }         if (pEnum_MagicPacketOnly) pEnum_MagicPacketOnly->Release();         /***************************************************************/         if (pObj_NetworkAdapter) pObj_NetworkAdapter->Release();    }     if (pEnum_NetworkAdapter) pEnum_NetworkAdapter->Release();        VariantClear(&val);    CoUninitialize();     getchar();     return 1;
}


Vấn đề là


VARIANT v;
VariantInit(&v);
V_VT(&v) = VT_BOOL;
V_BOOL(&v) = 0;

// Tại sao đoạn này ko có tác dụng
HRESULT h = pObj_DeviceWakeEnable->Put(L"Enable", 0, &v, CIM_BOOLEAN);

mình sử dụng method IWbemClassObject::Put() để cập nhật lại giá trị nhưng sao ko thấy hiệu quả (Đã sử dụng đúng kiểu dữ liệu). Trong khi cũng cách này, mình gõ bằng VBS / VB6 thì lại được ?

Phải chăng mình dùng hàm chưa đúng ?

Mình có đính kèm Project