2012-07-06 119 views
1

當我的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");

此外,您應該始終檢查LoadLibraryGetProcAddress函數返回的值,如果調用不成功,則返回NULL。

+0

我正在使用MinGW,'_T'的等價物是什麼。 – SIFE 2012-07-07 19:55:22

+1

@SIFE該宏是在''中定義的,它是mingw的一部分。 – alexisdm 2012-07-07 20:30:51