段错误更改默认网关
问题描述:
当我的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;
}
答
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 2012-07-07 19:55:22
@SIFE该宏是在''中定义的,它是mingw的一部分。 –
alexisdm
2012-07-07 20:30:51