【发布时间】: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