更改默认网关时出现分段错误
Posted
技术标签:
【中文标题】更改默认网关时出现分段错误【英文标题】:Segmentation fault when changing default gateway 【发布时间】:2012-07-06 21:00:46 【问题描述】:我在 Qt4 上编写了一个简单的应用程序来修改网络适配器参数,为此我有一个名为 setInterfaceParams
的插槽,实现方式如下:
DWORD WinNetInterface::setInterfaceParams(QString index, QString ip, QString netmask, QString gateway)
DWORD res = NULL;
HINSTANCE lib = (HINSTANCE) LoadLibrary((WCHAR *)"iphlpapi.dll");
_SetAdapterIpAddress SetAdapterIpAddress = (_SetAdapterIpAddress) GetProcAddress(lib, "SetAdapterIpAddress");
PWSTR pszGUID = NULL;
//char *szGUID = (char *)index.toStdString().c_str();
QByteArray a = index.toLocal8Bit();
char *szGUID = a.data();
WideCharToMultiByte(CP_ACP, 0, pszGUID, -1, szGUID, sizeof(szGUID), NULL, NULL);
// Method 01
res = SetAdapterIpAddress(szGUID,
0,
inet_addr(ip.toStdString().c_str()),
inet_addr(netmask.toStdString().c_str()),
inet_addr(gateway.toStdString().c_str()));
// End of method 01
// Method 02
/*res = SetAdapterIpAddress("422C5689-A17B-402D-A6A2-22CE13E857B5",
0,
inet_addr("192.168.1.10"),
inet_addr("255.255.255.0"),
inet_addr("192.168.1.1"));*/
// End of method 02
return res;
当我点击连接到插槽setInterfaceParams
的按钮时,我得到分段错误。如果我评论method01,什么都不会发生,当我使用method02时会发生一些事情。
我在一个简单的 c++ 应用程序上尝试了这个功能,它工作正常,在 Windows XP SP3 上测试。
#include <windows.h>
#include <winsock2.h>
#include <iphlpapi.h>
#include <stdio.h>
#include <iostream>
typedef DWORD (WINAPI *_SetAdapterIpAddress )(char *szAdapterGUID,
DWORD dwDHCP,
DWORD dwIP,
DWORD dwMask,
DWORD dwGateway);
int main()
HINSTANCE lib = (HINSTANCE) LoadLibrary("iphlpapi.dll");
_SetAdapterIpAddress SetAdapterIpAddress = (_SetAdapterIpAddress) GetProcAddress(lib, "SetAdapterIpAddress");
PWSTR pszGUID = NULL;
char szGUID[] = "422C5689-A17B-402D-A6A2-22CE13E857B5";
DWORD dwSize = 0;
WideCharToMultiByte(CP_ACP, 0, pszGUID, -1, szGUID, sizeof(szGUID), NULL, NULL);
DWORD res = SetAdapterIpAddress(szGUID,
0,
inet_addr("192.168.1.10"),
inet_addr("255.255.255.0"),
inet_addr("192.168.1.1"));
std::cout << res;
return 0;
【问题讨论】:
【参考方案1】:LoadLibrary((WCHAR *)"iphlpapi.dll");
这不行,文字字符串是 8 位的,没有真正转换的情况下强制转换不会使其变宽,因此 dll 加载可能失败。
您应该在传递给 WinAPI 函数的大多数文字字符串周围使用 TEXT
或 _T
宏,以根据编译选项使它们成为常规或宽:
LoadLibrary(_T("iphlpapi.dll"));
这将转换为LoadLibrary("iphlpapi.dll");
或LoadLibrary(L"iphlpapi.dll");
。
此外,您应该始终检查 LoadLibrary
和 GetProcAddress
函数返回的值,如果调用不成功,它们会返回 NULL。
【讨论】:
我正在使用 MinGW,_T
的等价物是什么。
@SIFE 宏定义在 <tchar.h>
中,它是 mingw 的一部分。以上是关于更改默认网关时出现分段错误的主要内容,如果未能解决你的问题,请参考以下文章
从 SSAS 网关刷新时出现“EffectiveUserName' XML for Analysis 属性无效”错误
构建 Android React Native 时出现错误的网关