在XP下如何连接WIFI?

shwee886 2009-07-27 09:09:47
请贴出可用代码,能用的话立即给分
...全文
3390 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
jamie0510 2011-02-23
  • 打赏
  • 举报
回复
LZ现在实现连接AP的功能了么?实现的话就共享一下吧.我也需要这方面的资料呢,谢谢~
shwee886 2009-07-28
  • 打赏
  • 举报
回复
我已经实现了以下功能:
1、获取AP列表(通过DeviceIoControl)
2、断开连接(通过WZCSetInterface)

现在就差连接AP的功能了
shwee886 2009-07-28
  • 打赏
  • 举报
回复
我已经尝试过WZCSetInterface可以用来断开与AP的连接,据说也可以用来连接AP,但是我一直没有尝试成功,可能是他们说的INTF_ENTRY结构体定义问题吧(函数执行成功,返回值正确,却没有生效)
shwee886 2009-07-28
  • 打赏
  • 举报
回复
To jiangsheng:
WlanConnect属于Native Wifi系列函数,该系列函数在SP3以及VISTA上有比较好的支持,不过现在用户大多是SP2 版本,在这个版本上想使用Native Wifi系列函数必须安装一个支持该系列函数的升级包,但是我们软件被定位为绿色,不能强迫用户安装这种包,所以只好作罢。您有更好的建议吗?
按道理说,比较通用的方法是WZC系列接口(听说是这样),但是这系列接口在XP SP2上支持不是很好(据说INTF_ENTRY 结构体XP 和 CE下不同,但MSDN里只有CE的资料,这系列接口在XP 上属于未公开函数),导致有的函数能用,有的函数不能用。
您是否有更好的建议?
蒋晟 2009-07-28
  • 打赏
  • 举报
回复
没啥通用的方法,软件这一层都不一样了,硬件更不一样。
蒋晟 2009-07-28
  • 打赏
  • 举报
回复
WlanConnect
shwee886 2009-07-28
  • 打赏
  • 举报
回复
补充:主要是因为必须跟硬件的依赖分离开来,而且WLAN API必须要用户SP2装补丁才能使用(我们软件被限制为绿色软件,所以这点不能强迫用户)。我现在可尝试的方法就是采用上层的,通用的方法了,各位有比较可行的方法吗?
shwee886 2009-07-28
  • 打赏
  • 举报
回复
补充:我是在XP SP2下开发
shwee886 2009-07-28
  • 打赏
  • 举报
回复
我有尝试过使用WZC的接口,可以断开,不过我使用WZCSetInterface来连接AP的时候,函数返回正确,但并没有连接上。我找了一些国外的资料,据说是INTF_ENTRY结构体和CE下定义的不一样,但是在XP下这个结构体没有公开,楼上的老兄是否知道什么具体什么原因导致?下面附上我连接AP的代码
typedef DWORD (WINAPI *pWZCQueryInterface)(
LPWSTR pSrvAddr,
DWORD dwInFlags,
PINTF_ENTRY pIntf,
LPDWORD pdwOutFlags
);

typedef DWORD (WINAPI *pWZCSetInterface)(
LPWSTR pSrvAddr,
DWORD dwInFlags,
PINTF_ENTRY pIntf,
LPDWORD pdwOutFlags
);


typedef DWORD (WINAPI * pWZCEnumInterfaces)(
LPWSTR pSrvAddr,
PINTFS_KEY_TABLE pIntfs
);


typedef VOID (WINAPI * pWZCDeleteIntfObj)(
PINTF_ENTRY pIntf
);

typedef VOID (WINAPI * pWZCPassword2Key)(
PWZC_WLAN_CONFIG pwzcConfig,
LPCSTR cszPassword
);



HMODULE hWZClib = LoadLibrary("wzcsapi.dll");
pWZCSetInterface WZCSetInterface = (pWZCSetInterface)GetProcAddress(hWZClib,"WZCSetInterface");
pWZCDeleteIntfObj WZCDeleteIntfObj = (pWZCDeleteIntfObj)GetProcAddress(hWZClib,"WZCDeleteIntfObj");
pWZCQueryInterface WZCQueryInterface = (pWZCQueryInterface)GetProcAddress(hWZClib,"WZCQueryInterface");

USES_CONVERSION;
DWORD dwInFlags = 0, dwOutFlags = 0;
INTF_ENTRY Intf;
// iestr Intf;
memset(&Intf, 0x00, sizeof(INTF_ENTRY));
Intf.wszGuid = A2W(m_strAdapterId.c_str()); // Your Adapter name…

// 查询
//WZCQueryInterface(NULL, INTF_ALL, &Intf, &dwOutFlags);
//WZC_802_11_CONFIG_LIST * pCurConfigList = (WZC_802_11_CONFIG_LIST *)Intf.rdStSSIDList.pData;


WZC_WLAN_CONFIG wzcConfig1;
memset(&wzcConfig1, 0, sizeof(wzcConfig1));
wzcConfig1.Length = sizeof(wzcConfig1);

// dwCtlFlags
wzcConfig1.dwCtlFlags = 0;
// Ssid
WCHAR *szSsidToConnect = L"dlink";
wzcConfig1.Ssid.SsidLength = wcslen(szSsidToConnect);
for(UINT i = 0; i<wzcConfig1.Ssid.SsidLength; i++)
wzcConfig1.Ssid.Ssid[i] = (char)szSsidToConnect[i];

// Privacy
wzcConfig1.Privacy = Ndis802_11WEPDisabled;

wzcConfig1.InfrastructureMode = Ndis802_11Infrastructure;

// Authentication
wzcConfig1.AuthenticationMode = Ndis802_11AuthModeOpen;

DWORD dwDataLen = sizeof(WZC_802_11_CONFIG_LIST);
WZC_802_11_CONFIG_LIST *pNewConfigList = (WZC_802_11_CONFIG_LIST
*)LocalAlloc(LPTR, dwDataLen);
pNewConfigList->NumberOfItems = 1;
pNewConfigList->Index = 0;
memcpy(pNewConfigList->Config, &wzcConfig1, sizeof(wzcConfig1));
Intf.rdStSSIDList.pData = (BYTE*)pNewConfigList;
Intf.rdStSSIDList.dwDataLen = dwDataLen;
pNewConfigList = (WZC_802_11_CONFIG_LIST *)Intf.rdStSSIDList.pData;

dwInFlags = 0;

DWORD dwStatus = WZCSetInterface(NULL, INTF_PREFLIST, (PINTF_ENTRY)&Intf,
&dwInFlags);

LocalFree(pNewConfigList);
蒋晟 2009-07-28
  • 打赏
  • 举报
回复
XP没有WIFI支持,SP2才有,不过WIFI卡公司大多还是在用自己的接口
如果你的WIFI卡可以用WZC控制,那么可以用Windows XP Wireless SDK里面的函数控制。如果不行,联系WIFI卡公司以获得开发接口。
shwee886 2009-07-27
  • 打赏
  • 举报
回复
……我是想在XP下通过编码来实现自己的程序连接WIFI
hhhh63 2009-07-27
  • 打赏
  • 举报
回复
连接WIFI不用写程序,装上驱动就能用了。咱们的程序不分有线无线网。

7,540

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 VC.NET
社区管理员
  • VC.NET社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧