2009-08-21 5 views
3

я это скопировал код из Example: Calling a Provider Method, он изменил его в настоящее время она должна изменить скорость вращения вентилятора CPU:Установить скорость вентилятора на Windows, в C++

#define _WIN32_DCOM 

#include <iostream> 
using namespace std; 
#include <comdef.h> 
#include <Wbemidl.h> 

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

int main(int iArgCnt, char ** argv) 
{ 
    if(IsDebuggerPresent())cout<<"Debugee?\n"; 
    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 must 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 negotiates service 
     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 local root\cimv2 namespace 
    // and obtain pointer pSvc to make IWbemServices calls. 
    hres = pLoc->ConnectServer(
     _bstr_t(L"ROOT\\CIMV2"), 
     NULL, 
     NULL, 
     0, 
     NULL, 
     0, 
     0, 
     &pSvc 
    ); 

    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 for 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 ---- 

    BSTR MethodName = SysAllocString(L"SetSpeed"); 
    BSTR ClassName = SysAllocString(L"CIM_Fan"); 

    IWbemClassObject* pClass = NULL; 
    hres = pSvc->GetObject(ClassName, 0, NULL, &pClass, NULL); 

    IWbemClassObject* pInParamsDefinition = NULL; 
    hres = pClass->GetMethod(MethodName, 0, 
     &pInParamsDefinition, NULL); 

    IWbemClassObject* pClassInstance = NULL; 
    hres = pInParamsDefinition->SpawnInstance(0, &pClassInstance); 

    // Create the values for the in parameters 
    VARIANT varCommand; 
    varCommand.vt = VT_BSTR; 
    varCommand.bstrVal = L"10"; 

    // Store the value for the in parameters 
    hres = pClassInstance->Put(L"CommandLine", 0, 
     &varCommand, 0); 
    wprintf(L"The command is: %s\n", V_BSTR(&varCommand)); 

    // Execute Method 
    IWbemClassObject* pOutParams = NULL; 
    hres = pSvc->ExecMethod(ClassName, MethodName, 0, 
    NULL, pClassInstance, &pOutParams, NULL); 

    if (FAILED(hres)) 
    { 
     cout << "Could not execute method. Error code = 0x" 
      << hex << hres << endl; 
     try{ 
     VariantClear(&varCommand); 
     SysFreeString(ClassName); 
     SysFreeString(MethodName); 
     pClass->Release(); 
     pInParamsDefinition->Release(); 
     // pOutParams->Release(); 
     pSvc->Release(); 
     pLoc->Release();  
     CoUninitialize(); 
     } 
     catch(...){ 
      cout<<""; // NOTHING 
     }; 
     system("pause"); 
     return 1;    // Program has failed. 
    } 

    // To see what the method returned, 
    // use the following code. The return value will 
    // be in &varReturnValue 
    VARIANT varReturnValue; 
    hres = pOutParams->Get(_bstr_t(L"ReturnValue"), 0, 
     &varReturnValue, NULL, 0); 


    // Clean up 
    //-------------------------- 
    VariantClear(&varCommand); 
    VariantClear(&varReturnValue); 
    SysFreeString(ClassName); 
    SysFreeString(MethodName); 
    pClass->Release(); 
    pInParamsDefinition->Release(); 
    pOutParams->Release(); 
    pLoc->Release(); 
    pSvc->Release(); 
    CoUninitialize(); 
    system("pause"); 
    return 0; 
} 

Когда я запускаю это, он не работает. Что я должен изменить?

+2

. Не рекомендуется ли играть с частотой вращения вентилятора процессора? Также, пожалуйста, отправляйте любые сообщения об ошибках, если они есть? – pjp

ответ

0

Контроль скорости вентилятора через WMI будет довольно специфичным для поставщика; нет никаких общих элементов управления для вентиляторов CPU/материнской платы (хотя WMI - это то, что делают люди )). Кроме того, это было бы способом проще в PowerShell или даже C#, чем пытаться использовать C++ для работы с WMI. По крайней мере, выясните, как это сделать в PSh сначала, а затем перепишите его на C++.

Смежные вопросы