【问题标题】:On enabling Network adapter, Autoconfiguration IP address getting set在启用网络适配器时,自动配置 IP 地址正在设置
【发布时间】:2011-06-25 10:37:40
【问题描述】:

我正在使用 Visual Studio C++ 为 Windows Vista 和 7 开发一个应用程序,我必须在其中为网卡分配静态 IP 地址并建立连接。为此,我在注册表中输入 Ip 值并将启用 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,但它无法禁用或启用网卡。

请提出我做错的地方或我遗漏的任何地方。

【问题讨论】:

  • Waaay 嵌套层级太多,代码无法阅读。
  • 我不知道这是否是正确的做法;你可能想看看 Win32_NetworkAdapterConfiguration WMI 类,看看它是否支持你正在尝试做的事情。
  • @Luke 我从这个 msdn link 发现了有关 INetConnectionManager 的信息。我还可以看到网卡被它禁用和启用。但不是设置的值。 我还想问你,除了编辑注册表和禁用-启用网卡来设置静态 IP 值之外,还有什么其他需要的吗??? 这和 windows os 处理这个任务的方式一样吗??跨度>
  • @Cody Gray 我再次编辑了代码。希望你觉得它可读。我是新来的,所以第一次做错了。请告诉我这里是否缺少设置静态 ip 值的内容。
  • 我发现了问题!!!首先,这段代码禁用/启用网络适配器没有任何问题。唯一的问题是它需要管理员登录。为此,我已从项目属性中授予该应用程序的 UAC 权限。在禁用/启用网络适配器之前,我在设置注册表值时出错了(没有正确处理 REG_MULTI_SZ 值)。我现在修好了。它在 windows xp、vista 和 7 中运行良好。感谢和问候

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


【解决方案1】:

【讨论】:

  • 嗨!我以前也尝试过使用它。 AddIPAddress 只会在操作系统维护的网络表中添加 IP 地址和子网掩码。但是这些值不会为网络配置(除非当前使用的值无法提供网络连接)。因此,我不得不进行注册表编辑。问候
【解决方案2】:

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

问候 IP_电话

【讨论】:

  • @IP_Telephony- INetConnectionManager 需要管理员登录才能工作。在这方面你是对的。我已从 Project Properties->Manifest File 授予 UAC 对我的应用程序的访问权限。然后它也可以在 win vista 和 7 中工作。
猜你喜欢
  • 2013-05-20
  • 2022-03-03
  • 2013-06-12
  • 2019-07-03
  • 2019-04-18
  • 2023-04-08
  • 2010-12-12
  • 1970-01-01
相关资源
最近更新 更多