2

我正在尝试调用 WlanGet 可用网络,但它失败并出现错误 1168 (ERROR_NOT_FOUND),然后重新运行成功。我认为这是我初始化 out 指针的方式,但无法使其工作,即使我可以重复获得 GUID 指针。我正在构建一个供我自己使用的托管包装器,所以现在我的调用代码是一个 Nunit 框架。

失败运行的输出:

        ***** zz_Test_Fixture_TDD.NetworkListTester.NetworkListTest
Guid Pointer = 89327880
Client Handle and GUID pointers initialized
 handle 1   Guid pointer = 89327880 Avail network pointer = 0
 handle 1   Guid pointer = 89327880 Avail network pointer = 0
Wlan Get Avail networks Failed by error =1168

通过运行的输出:

***** zz_Test_Fixture_TDD.NetworkListTester.NetworkListTest
Guid Pointer = 89008544
Client Handle and GUID pointers initialized
 handle 17   Guid pointer = 89008544 Avail network pointer = 0
 handle 17   Guid pointer = 89008544 Avail network pointer = 89415752
Number of Networks Found = 18

这是我的代码:

    [TestFixture]
            public class NetworkListTester
            {
             IntPtr pclientHandle;
            Guid ThisInterfaceGuid;
            IntPtr pGuid;

            [Test]
            public void NetworkListTest()
            {
             pclientHandle = WiFiApi.GetClientHandle();
            ThisInterfaceGuid = WiFiApi.GetCurrentInterfaceGuid(pclientHandle);
            pGuid = WiFiApi.GetCurrentInterfaceGuidPointer(pclientHandle);
            Console.WriteLine("Guid Pointer = " + pGuid);
            Console.WriteLine("Client Handle and GUID pointers initialized");


            IntPtr pAvailNetWorks = new IntPtr();

        uint dwFlags = 3;
        uint error = 99;
        Console.WriteLine(" handle " + pclientHandle + "   Guid pointer = " + pGuid + " Avail network pointer = " + pAvailNetWorks);
        error = WiFiApi.WlanGetAvailableNetworkList(pclientHandle, pGuid, dwFlags, IntPtr.Zero, out pAvailNetWorks);
        Console.WriteLine(" handle " + pclientHandle + "   Guid pointer = " + pGuid + " Avail network pointer = " + pAvailNetWorks);
        if (error != 0)
        {

            Console.WriteLine("Wlan Get Avail networks Failed by error =" + error);
//same impact with or without this retry
//also added a Thread.Sleep(60000); before the call with no impact
            error = WiFiApi.WlanGetAvailableNetworkList(pclientHandle, pGuid, dwFlags, IntPtr.Zero, out pAvailNetWorks);

        }
        else
        {
            //tests intentionally outside of else so they will fail if an error.
        }
        //todo get managed pointer for available networks
        WiFiApi.WLAN_AVAILABLE_NETWORKS_LIST NetworkList = (WiFiApi.WLAN_AVAILABLE_NETWORKS_LIST)Marshal.PtrToStructure(pAvailNetWorks, typeof(WiFiApi.WLAN_AVAILABLE_NETWORKS_LIST));
        Console.WriteLine("Number of Networks Found = " + NetworkList.NumberOfNetworks);
        Assert.Greater(NetworkList.NumberOfNetworks, 0);
        Assert.Less(NetworkList.CurrentNetwork, NetworkList.NumberOfNetworks);


                //close handle
        WiFiApi.CloseClientHandle(pclientHandle);
        WiFiApi.WlanFreeMemory(pGuid);
                WiFiApi.WlanFreeMemory(pAvailNetWorks);

            }

这是我正在调用的函数:

        [DllImport("Wlanapi.dll")]
    public static extern uint WlanGetAvailableNetworkList(
                IntPtr _hClientHandle,
                IntPtr _InterfaceGuid,
                UInt32 _dwFlags,
                IntPtr _pReserved,
                out IntPtr ppAvailableNetworkList);
4

0 回答 0