在启用网络适配器时,将设置自动配置IP地址

时间:2011-02-11 09:29:42

标签: c++ windows winapi network-programming wmi

我正在使用Visual Studio C ++开发Windows Vista和7的应用程序,其中我必须为网卡分配静态IP地址并建立连接。为此,我在注册表中输入Ip值,同时将Enable DHCP值设置为0.然后我需要禁用然后启用网卡才能使这些值生效。为此,我在以下代码中使用“INetConnectionManager”:

  CoInitialize(0);
  typedef void (__stdcall * PNcFreeNetconProperties)(NETCON_PROPERTIES* pProps);
  HMODULE hmod = LoadLibrary(L"netshell.dll");
  if (!hmod) 
    return false;

  LPNcFreeNetconProperties NcFreeNetconProperties =
    (LPNcFreeNetconProperties)GetProcAddress(hmod, "NcFreeNetconProperties");

  if (!NcFreeNetconProperties )
    return false;

  INetConnectionManager * pMan = 0;

  HRESULT hres = CoCreateInstance(CLSID_ConnectionManager,
                  0,
                  CLSCTX_ALL,
                  __uuidof(INetConnectionManager),
                  (void**)&pMan);

  if (SUCCEEDED(hres))  
  {    
      IEnumNetConnection * pEnum = 0;
      hres = pMan->EnumConnections(NCME_DEFAULT, &pEnum);
     if (SUCCEEDED(hres)) 
     {
         INetConnection * pCon = 0;
         ULONG count;
         bool done = false;
         while (pEnum->Next(1, &pCon, &count) == S_OK && !done)
         {
             NETCON_PROPERTIES * pProps = 0;
             hres = pCon->GetProperties(&pProps);
             if (SUCCEEDED(hres)) 
             {
                 if (wcscmp(pProps-pszwDeviceName, AdapterName) == 0)
                 {
                     if (bEnable)
                         result = (pCon->Connect() == S_OK);
                     else
                         result = (pCon->Disconnect() == S_OK);
                     done = true;
                 }

                 NcFreeNetconProperties(pProps);
              }
              pCon->Release();
         }
         pEnum->Release();
     }
    pMan->Release();
  }
  FreeLibrary(hmod);
  CoUninitialize();

它非常好地禁用和启用网卡,但是自动配置IPv4值正在设置而不是注册表中的静态值。这奇怪地适用于DHCP连接,但不适用于静态连接。

注意:我甚至尝试过SetIfEntry,但它无法禁用或启用网卡。

请说明我做错了什么或我错过了什么。

谢谢和问候,

维纳亚克

2 个答案:

答案 0 :(得分:0)

答案 1 :(得分:0)

Windows VISTA和Win7上是否支持INetConnectionManager?我已经实现了您在此处编写的相同代码,但是当应用程序在非管理员登录时运行时,我对pCon-> Connect的访问被拒绝。因此,看起来我们需要使用COM Moniker提升com对象。

此致 IP_Telephony