vb.net想运用WLANAPI里的函数,确无法获取参数WIFI参数

bullswq 2017-03-14 10:16:58
Private Declare Function WlanOpenHandle Lib "wlanapi.dll" (ByVal dwClientVersion As UInteger, ByVal pReserved As IntPtr, <Out()> ByRef pdwNegotiatedVersion As UInteger, ByRef phClientHandle As IntPtr) As UInteger
Private Declare Function WlanCloseHandle Lib "wlanapi.dll" (<[In]()> ByVal hClientHandle As IntPtr, ByVal pReserved As IntPtr) As UInteger
Private Declare Function WlanEnumInterfaces Lib "wlanapi.dll" (<[In]()> ByVal hClientHandle As IntPtr, ByVal pReserved As IntPtr, <Out()> ByRef ppInterfaceList As IntPtr) As UInteger

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim dwCurVersion As UInteger
Dim hClient As UInteger
Me.Text = WlanOpenHandle(2, Nothing, dwCurVersion, hClient)
Dim pi As IntPtr
Dim dwresult = WlanEnumInterfaces(hClient, Nothing, pi)
Dim rt As WLAN_INTERFACE_INFO_LIST
rt = Marshal.PtrToStructure(pi, GetType(WLAN_INTERFACE_INFO_LIST))
Label1.Text = rt.dwNumberofItems
End Sub
...全文
602 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
bullswq 2017-03-16
  • 打赏
  • 举报
回复
本人是纯粹新手,写这个引用API的程序,没有其他目的,就是看着网络上全是C++、安卓、CSHARP的例子困惑,为啥就没有咱VB.NET的,纯粹是好奇而已!
bullswq 2017-03-16
  • 打赏
  • 举报
回复
经过努力和修改,已经把WLANAPI的部分函数通过VB.NET展现出来,这里感谢帮助我的各位兄弟,举杯邀明月,TIGER_ZHAO,以及赵4老师等人,在此一并谢过! 这里也声明下,平台上给的函数没有错,像TIGER_ZHAO老师说的,参数非常重要,帮我指出了INTPTR.ZERO的错误,非常感谢!
bullswq 2017-03-16
  • 打赏
  • 举报
回复
bullswq 2017-03-15
  • 打赏
  • 举报
回复
引用 4 楼 Tiger_Zhao 的回复:
IntPtr 参数要用同样的类型啊,你的 hClient 是什么?还有要用 IntPtr.Zero 代替 Nothing。
hClient 相当于产生一个句柄,是返回值,另外,用 IntPtr.Zero 代替 Nothing!!收到,谢谢指导。我慢慢改吧,一步步来
bullswq 2017-03-15
  • 打赏
  • 举报
回复
后续的那个几个函数我知道,但是前面的都进行不下去,后面更无从谈起
bullswq 2017-03-15
  • 打赏
  • 举报
回复
引用 5 楼 Chen8013 的回复:
[quote=引用 3 楼 bullswq 的回复:] api函数含结构体,结构体里又包含结构体,还带指针,参数复杂啊,c++就引用过去了,vb.net咋这么不容易
这个东西,如果“没有现成的”可用,当然没这么简单。 你贴出来的那几句代码,只能获取到“本机无线网卡”的一些信息,跟“WIFI信号”一点儿都没关系。 你要得到WIFI热点的列表和信号强度等信息, 需要调用的是 WlanScan( )、WlanGetAvailableNetworkList( )等几个API。 以前我用VB6写过一个,只做到了“扫描”的那一步,查“连接WIFI热点”的代码,根本都找不到什么名堂了, 网上能找到的有“连接操作”的代码,全是安卓的,它有现成的接口函数,就两三句代码的事; C++代码的根本就找不到,就没继续了。  我也不清楚你用VB.NET应该如何写,看起来跟VB6的差异还是有点大。 当时写那个VB6的代码,查了很多WIFI相关API的资料,全是C++代码、En文的说明,看得真费劲…… “翻译”过来的代码,仅是“声明”部分,10来个重要的API、加上需要用到的类型声明等,就超过了300行。 并且,有一些“类型(结构体)”的声明信息,似乎还是错误的,我还在调试中进行过校正。 很多API都是一大堆的参数………… 贴张效果图给你看看。 [/quote] 确实,我后面没法继续下去了,卡在这部分,网上关于WIFI的VB.NET代码可参考的少得可怜,不像安卓和Csharp,一搜一大堆
赵4老师 2017-03-15
  • 打赏
  • 举报
回复
不要做A语言代码修改为B语言代码的无用功。 也不要做用A语言代码直接调用B语言代码库这样复杂、这样容易出错的傻事。 只需让A、B语言代码的输入输出重定向到文本文件,或修改A、B语言代码让其通过文本文件输入输出。 即可很方便地让A、B两种语言之间协调工作。 比如: A将请求数据写到文件a.txt,写完后改名为aa.txt B发现aa.txt存在时,读取其内容,调用相应功能,将结果写到文件b.txt,写完后删除aa.txt,改名为bb.txt A发现bb.txt存在时,读取其内容,读完后删除bb.txt 以上A可以替换为任何一种开发语言或开发环境,B可以替换为任何一种与A不同的开发语言或开发环境。 除非A或B不支持判断文件是否存在、文件读写和文件更名。 但是谁又能举出不支持判断文件是否存在、文件读写和文件更名的开发语言或开发环境呢? 可以将临时文件放在RamDisk上提高效率减少磨损磁盘。 数据的结构很复杂的话,文本文件的格式问题可参考json或xml 共享临时文本文件这种进程之间的通讯方法相比其它方法的优点有很多,下面仅列出我现在能想到的: ·进程之间松耦合 ·进程可在同一台机器上,也可跨机,跨操作系统,跨硬件平台,甚至跨国。 ·方便调试和监视,只需让第三方或人工查看该临时文本文件即可。 ·方便在线开关服务,只需删除或创建该临时文本文件即可。 ·方便实现分布式和负载均衡。 ·方便队列化提供服务,而且几乎不可能发生队列满的情况(除非硬盘空间满) ·…… “跨语言、跨机,跨操作系统,跨硬件平台,跨国,跨*.*的”苦海无边, 回头是“使用共享纯文本文件进行信息交流”的岸!
舉杯邀明月 2017-03-15
  • 打赏
  • 举报
回复
引用 3 楼 bullswq 的回复:
api函数含结构体,结构体里又包含结构体,还带指针,参数复杂啊,c++就引用过去了,vb.net咋这么不容易

这个东西,如果“没有现成的”可用,当然没这么简单。
你贴出来的那几句代码,只能获取到“本机无线网卡”的一些信息,跟“WIFI信号”一点儿都没关系。

你要得到WIFI热点的列表和信号强度等信息,
需要调用的是 WlanScan( )、WlanGetAvailableNetworkList( )等几个API。
以前我用VB6写过一个,只做到了“扫描”的那一步,查“连接WIFI热点”的代码,根本都找不到什么名堂了,
网上能找到的有“连接操作”的代码,全是安卓的,它有现成的接口函数,就两三句代码的事;
C++代码的根本就找不到,就没继续了。 
我也不清楚你用VB.NET应该如何写,看起来跟VB6的差异还是有点大。

当时写那个VB6的代码,查了很多WIFI相关API的资料,全是C++代码、En文的说明,看得真费劲……
“翻译”过来的代码,仅是“声明”部分,10来个重要的API、加上需要用到的类型声明等,就超过了300行。
并且,有一些“类型(结构体)”的声明信息,似乎还是错误的,我还在调试中进行过校正。
很多API都是一大堆的参数…………

贴张效果图给你看看。
Tiger_Zhao 2017-03-15
  • 打赏
  • 举报
回复
IntPtr 参数要用同样的类型啊,你的 hClient 是什么?还有要用 IntPtr.Zero 代替 Nothing。
bullswq 2017-03-15
  • 打赏
  • 举报
回复
api函数含结构体,结构体里又包含结构体,还带指针,参数复杂啊,c++就引用过去了,vb.net咋这么不容易
bullswq 2017-03-15
  • 打赏
  • 举报
回复
我想试着获取wifi信号强度,目前到wlanenumfaceinfo进行不下去,我的api参数设置是不是有问题,msdn只有c++例子,麻烦看看
Tiger_Zhao 2017-03-15
  • 打赏
  • 举报
回复
我才不管定义对不对,只看到调用传入的参数类型和定义不一致。
舉杯邀明月 2017-03-15
  • 打赏
  • 举报
回复
引用 10 楼 Tiger_Zhao 的回复:
hClient 的类型不对啊!

哈哈,刚才看了一下,他的API参数类型好像还真不对。

在WlanOpenHandle() 中,hClient是返回值用的,那儿是“地址引用”似乎没错;
但另两个API中,是要用“句柄值”,应该是 传值的。

bullswq 2017-03-15
  • 打赏
  • 举报
回复
C# Signature: [DllImport("Wlanapi.dll")] private static extern int WlanOpenHandle( uint dwClientVersion, IntPtr pReserved, //not in MSDN but required [Out] out uint pdwNegotiatedVersion, out IntPtr ClientHandle); VB Signature: <DllImport("Wlanapi", EntryPoint := "WlanOpenHandle")> _ Public Shared Function WlanOpenHandle(ByVal dwClientVersion As UInteger, ByVal pReserved As IntPtr, <Out> ByRef pdwNegotiatedVersion As UInteger, ByRef phClientHandle As IntPtr) As UInteger End Function 这是平台上找到的原文,对 WLANOPENHANDE的C++和VB.NET写法对照
Tiger_Zhao 2017-03-15
  • 打赏
  • 举报
回复
hClient 的类型不对啊!
舉杯邀明月 2017-03-14
  • 打赏
  • 举报
回复
你想获取什么参数?

1,486

社区成员

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

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