你好,欢迎来到电脑编程技巧与维护杂志社! 杂志社简介广告服务读者反馈编程社区  
合订本订阅
 
 
您的位置:杂志经典 / 网络与通信
静态IP自动配置的实现(四)
 

SetIPSetDnsSetGate三个成员函除均是通过C++调用WMI组件中对应的方法实现的,其实现基本类似,这里仅以SetIP作简要说明,源码如下:

void CWMI::SetIP(LPWSTR IPAddress,LPWSTR SubnetMask){

    setIndexByAdapterName();

    EnableStatic(IPAddress,SubnetMask);

}

setIndexByAdapterNameCWMI类实现的成员函数,实现了对当前主机的网络适配器的选择操作。

EnableStatic成员函数是对WMIWin32_NetworkAdapterConfiguration类中EnanleStatic方法的封装,源代码如下:

HRESULT CWMI::EnableStatic(LPWSTR IPAddress,LPWSTR SubnetMask){

    ULONG Status=0;

    NetWorkResource = SysAllocString(L"root\\cimv2");

    WCHAR AdapterIndex[128];

    wsprintf(AdapterIndex,

        L"Win32_NetworkAdapterConfiguration=%ld",index);

    InstancePath = SysAllocString(AdapterIndex);

    ClassPath = SysAllocString(L"Win32_NetworkAdapterConfiguration");

    MethodName = SysAllocString(L"EnableStatic");

    LPCWSTR Arg1Name = L"IPAddress";

    VARIANT var1;

    LPCWSTR Arg2Name = L"SubnetMask";

    VARIANT var2;

   

    hr = CoInitializeEx(NULL,COINIT_MULTITHREADED);

    if(FAILED(hr)){

        MessageBox(NULL,L"CoInitializeEx",L"Error",MB_OK);

        Clean();

        return hr;

    }

 

    CreateOneElementBstrArray(&var1,IPAddress);

    CreateOneElementBstrArray(&var2,SubnetMask);

 

    CoCreateInstance(CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER,

        IID_IWbemLocator, (void**)&pLocator);

    hr = pLocator->ConnectServer(NetWorkResource,NULL, NULL, NULL, 0, NULL, NULL,

        &pNamespace);

    hr = CoSetProxyBlanket(pNamespace,

        RPC_C_AUTHN_WINNT,

        RPC_C_AUTHZ_NONE,

        NULL,

        RPC_C_AUTHN_LEVEL_CALL,

        RPC_C_IMP_LEVEL_IMPERSONATE,

        NULL,

        EOAC_NONE);

 

    if(FAILED(hr))  { Clean();MessageBox(NULL,L"CoSetProxyBlanket",L"Error",MB_OK); return hr; }

    else

        hr = pNamespace->GetObject(ClassPath, 0, NULL, &pClass, NULL);

 

    if(FAILED(hr)){Clean();MessageBox(NULL,L"GetObject",L"Error",MB_OK);return hr; }

    else

        hr = pClass->GetMethod(MethodName, 0, &pInClass, NULL);

 

    if(FAILED(hr)){ Clean();MessageBox(NULL,L"GetMethod",L"Error",MB_OK);return hr; }

    else

        hr = pInClass->SpawnInstance(0, &pInInst);

 

    if(FAILED(hr))  { Clean();MessageBox(NULL,L"SpawnInstance",L"Error",MB_OK);return hr; }

    else

        hr = pInInst->Put(Arg1Name, 0, &var1, 0);

 

    if(FAILED(hr)){ Clean();MessageBox(NULL,L"Put",L"Error",MB_OK);return hr; }

    else

        hr = pInInst->Put(Arg2Name, 0, &var2, 0);

 

    if(FAILED(hr)){ Clean();return hr; }

    else{

        VARIANT resultParameter;

        ULONG Status;

        hr = pNamespace->ExecMethod(InstancePath, MethodName, 0, NULL,

        pInInst, &pOutInst, NULL);

        if(SUCCEEDED(pOutInst->Get(L"ReturnValue",0,&resultParameter,NULL,NULL))){

            Status = resultParameter.ulVal;

            VariantClear(&resultParameter);

            TRACE1("返回值:%lu\n",Status);

        }

        else{

            TRACE0("参数未能获得");

            MessageBox(NULL,L"ExecMethod",L"Error",MB_OK);

        }

    }

 

    VariantClear(&var1);

    VariantClear(&var2);

    Clean();

    return Status;

}

其中CreateOneElementBstrArrayCWMI类的成员函数,实现了封装一个BSTR数组,代码如下:

void CWMI::CreateOneElementBstrArray(VARIANT* v, LPCWSTR s){

    SAFEARRAYBOUND bound[1];

    SAFEARRAY* array;

    bound[0].lLbound = 0;

    bound[0].cElements = 1;

    array = SafeArrayCreate(VT_BSTR, 1, bound);

    long Index = 0;

    BSTR bstr = SysAllocString(s);

    SafeArrayPutElement(array, &Index, bstr);

    SysFreeString(bstr);

    VariantInit(v);

    v->vt = VT_BSTR | VT_ARRAY;

    v->parray = array;

}

3.设计技巧

使用WMI测试程序进行WMI测试,Windows Management InstrumentationWMI)测试程序,也叫做WBEMTest,是一个在Windows Management InstrumentationWMI)服务程序和WMI应用程序开发期间,用于查看和更改公共信息模型(Common Information ModelCIM)类、实例和方法的常规工具。

  推荐精品文章

·2024年12月目录 
·2024年11月目录 
·2024年10月目录 
·2024年9月目录 
·2024年8月目录 
·2024年7月目录 
·2024年6月目录 
·2024年5月目录 
·2024年4月目录 
·2024年3月目录 
·2024年2月目录 
·2024年1月目录
·2023年12月目录
·2023年11月目录

  联系方式
TEL:010-82561037
Fax: 010-82561614
QQ: 100164630
Mail:gaojian@comprg.com.cn

  友情链接
 
Copyright 2001-2010, www.comprg.com.cn, All Rights Reserved
京ICP备14022230号-1,电话/传真:010-82561037 82561614 ,Mail:gaojian@comprg.com.cn
地址:北京市海淀区远大路20号宝蓝大厦E座704,邮编:100089