首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >更改默认网关时出现分段故障

更改默认网关时出现分段故障
EN

Stack Overflow用户
提问于 2012-07-07 05:00:47
回答 1查看 748关注 0票数 1

我在Qt4上写了一个简单的应用程序来修改网络适配器参数,为此我有一个名为setInterfaceParams的插槽,实现如下:

代码语言:javascript
复制
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上测试它工作得很好。

代码语言:javascript
复制
#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;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-07-07 20:24:46

代码语言:javascript
复制
LoadLibrary((WCHAR *)"iphlpapi.dll");

这是行不通的,文字字符串是8位的,没有真正的转换就强制转换它不会使它变宽,所以dll加载可能会失败。

根据编译选项,应使用TEXT_T宏将传递给WinAPI函数的大多数文字字符串设置为常规字符串或宽度字符串:

代码语言:javascript
复制
LoadLibrary(_T("iphlpapi.dll"));

它将转换为LoadLibrary("iphlpapi.dll");LoadLibrary(L"iphlpapi.dll");

此外,您应该始终检查LoadLibraryGetProcAddress函数返回的值,如果调用不成功,这两个函数将返回NULL。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11369597

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档