更改默认网关时出现分段错误

Segmentation fault when changing default gateway

提问人:SIFE 提问时间:7/7/2012 更新时间:7/7/2012 访问量:782

问:

我在 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;
}

当我单击连接到插槽的按钮时,我遇到分段错误。如果我注释 method01,则不会发生任何事情,当我使用 method02 时会发生一些事情。 我在一个简单的 c++ 应用程序上尝试了这个功能,它工作正常,在 Windows XP SP3 上测试。setInterfaceParams

#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;
}
WinAPI QT4 网关 iphelper

评论


答:

1赞 alexisdm 7/7/2012 #1
LoadLibrary((WCHAR *)"iphlpapi.dll");

这行不通,文字字符串是 8 位的,在没有实际转换的情况下强制转换它不会使它变宽,因此 dll 加载可能失败。

应在传递给 WinAPI 函数的大多数文本字符串周围使用 or 宏,以使它们成为常规或宽,具体取决于编译选项:TEXT_T

LoadLibrary(_T("iphlpapi.dll"));

这将转换为 either 或 .LoadLibrary("iphlpapi.dll");LoadLibrary(L"iphlpapi.dll");

此外,还应始终检查 and 函数返回的值,如果调用不成功,则返回 NULL。LoadLibraryGetProcAddress

评论

0赞 SIFE 7/8/2012
我正在使用 MinGW,等价物是什么。_T
1赞 alexisdm 7/8/2012
@SIFE 定义宏是 mingw 的一部分。<tchar.h>