其實根據個人實踐,在wince下面重啓網卡其實十分簡單,直接把驅動程序和網卡分離而後再綁定一次就行了。怎麼綁定呢。就是一個函數DeviceIoControl和底層通訊下。
方法1 :把第二個參數設爲IOCTL_NDIS_REBIND_ADAPTER。直接分離和綁定
方法2 :把第二個參數設爲IOCTL_NDIS_UNBIND_ADAPTER分離,而後再IOCTL_NDIS_BIND_ADAPTER綁定也能達到相同的效果。
我測試用的平臺是X86的wince5.0。固然用DeviceIoControl的第一個參數須要獲取設備的句柄 :
hNdis = CreateFile(DD_NDIS_DEVICE_NAME, GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_ALWAYS,
0, NULL);
網絡
其實wince對網卡的控制函數作的已經不錯了。用DeviceIoControl後面第二個參數帶IOCTL_NDIS_GET_ADAPTER_NAMES的話很容易獲取到網卡的名字,能夠用來遍歷網卡。若是照我所說的方法,編譯出現問題,你可能沒包含ntddndis.h這個頭文件。函數
//////////////////////////////////////////////////////////測試
///WinCE下從新設置IP地址無需從新啓動debug
//////////////////////orm
#include <ndis.h>
bool SetIpAddress(CString m_strIp,CString m_strMask,CString m_strGateWay)
{
//得到網卡的設備名
WCHAR Names[50];
DWORD bytes;
HANDLE m_hFileHandle = CreateFile(_T("NDS0:"), 0, 0, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,
(HANDLE) INVALID_HANDLE_VALUE);
if( m_hFileHandle == INVALID_HANDLE_VALUE )
{
MessageBox(NULL,_T("得到網卡名時打開設備錯誤"),NULL,0);
return false;
}
// Get list of adapter names
if (!DeviceIoControl(m_hFileHandle,
IOCTL_NDIS_GET_ADAPTER_NAMES,
NULL,0,
Names,MAX_PATH,&bytes,NULL))
{
MessageBox(NULL,_T("得到網卡名錯誤"),NULL,0);
return false;
}
DWORD len = wcslen(Names);
Names[len] = 0;
Names[len+1] = 0;
CString strKeyName;
strKeyName.Format(_T("Comm\\%s\\Parms\\TCPIP"),Names);
//打開註冊表對網卡IP信息對應子健進行修改
HKEY hkey;
if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,strKeyName,0,KEY_WRITE,&hkey) != ERROR_SUCCESS)
{
MessageBox(NULL,TEXT("打開註冊表錯誤"),NULL,0);
return false;
}
DWORD value;
value = 0;
WCHAR buffer[50];
//set EnableDHCP
if(RegSetValueEx(hkey,TEXT("EnableDHCP"),0,REG_DWORD,(const unsigned char *)&value,sizeof(DWORD)) != ERROR_SUCCESS)
MessageBox(NULL,TEXT("關閉自動得到IP錯誤"),NULL,0);
//set ip address
memset(buffer,0,100);
memcpy(buffer,m_strIp.GetBuffer(0),m_strIp.GetLength()*2);
if(RegSetValueEx(hkey,TEXT("IpAddress"),0,REG_MULTI_SZ,(const unsigned char *)buffer, m_strIp.GetLength()*2+2) != ERROR_SUCCESS)
MessageBox(NULL,TEXT("設置IP錯誤"),NULL,0);
//set subnet mask
memset(buffer,0,100);
memcpy(buffer,m_strMask.GetBuffer(0),m_strMask.GetLength()*2);
if(RegSetValueEx(hkey,TEXT("SubnetMask"),0,REG_MULTI_SZ,(const unsigned char *)buffer, m_strMask.GetLength()*2+2) != ERROR_SUCCESS)
MessageBox(NULL,TEXT("設置子網掩碼錯誤"),NULL,0);
//set gateway
memset(buffer,0,100);
memcpy(buffer,m_strGateWay.GetBuffer(0),m_strGateWay.GetLength()*2);
if(RegSetValueEx(hkey,TEXT("DefaultGateway"),0,REG_MULTI_SZ,(const unsigned char *)buffer, m_strGateWay.GetLength()*2+2) != ERROR_SUCCESS)
MessageBox(NULL,TEXT("設置網關錯誤"),NULL,0);
RegFlushKey(hkey);
RegCloseKey(hkey);
// 重啓網卡,不用機器熱啓動
HANDLE hNdis = CreateFile(_T("NDS0:"), 0, 0, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,
(HANDLE) INVALID_HANDLE_VALUE);
if( hNdis == INVALID_HANDLE_VALUE )
{
MessageBox(NULL,_T( "重啓網絡驅動時打開設備錯誤"),NULL,0);
return false;
}
// Send the device command.
if (!DeviceIoControl( hNdis, IOCTL_NDIS_REBIND_ADAPTER,
Names, _tcslen( Names) + sizeof( TCHAR ), // buf contains the name of the
NULL, 0, NULL, NULL ) )
{
MessageBox(NULL,_T( "重啓網絡驅動錯誤"),NULL,0);
}
CloseHandle( hNdis );
return true;
}
需注意:1 使用標準SDK的朋友,可能用到的頭文件有:pkfuncs.h,toolhelp.h,lss.h,本身須要到你的WINCE500目錄下搜索這幾個頭文件;2 你的WINCE工程目錄輸出若不是debug版,上面頭文件可能使用有錯誤,使用Release版將上面函數封裝成一個靜態庫使用。ip