1 (изменено: MandarinKa02, 2018-01-30 22:46:57)

Тема: AHK: DllCall WlanOpenHandle WlanEnumInterfaces

Помогите с помощью dllcall вызвать две функции:
WlanOpenHandle
WlanEnumInterfaces
Никак не могу понять что не так. Вот, на чем остановился:


	WlanOpenHandle(ByRef version, ByRef handle, pReserved="") {
		dwClientVersion:=2
		return DllCall("wlanapi.dll\WlanOpenHandle"
			, "int", dwClientVersion
			, "int", pReserved
			, "uint*", version:=pdwNegotiatedVersion
			, "uint*", handle:=phClientHandle)
	}

	WlanEnumInterfaces(handle, ByRef list, pReserved="") {
		static PtrSize := A_PtrSize
		static ppInterfaceList, size := 16 + PtrSize
		VarSetCapacity(ppInterfaceList, size, 0)
		DllCall("wlanapi.dll\WlanEnumInterfaces"
			, "int", handle
			, "int", pReserved
			, "Ptr", &ppInterfaceList) ;ppInterfaceList - это возвращаемая структура, как из нее получить данные?
	}

Заранее спасибо!
Ps Я с DllCall работаю впервые и толком ничего не знаю.

Покинул форум

2

Re: AHK: DllCall WlanOpenHandle WlanEnumInterfaces

Вероятно, так.


    WlanOpenHandle(ByRef version, ByRef handle) {
        dwClientVersion:=2
        return DllCall("wlanapi.dll\WlanOpenHandle"
            , "int", dwClientVersion
            , "ptr", 0
            , "uint*", version
            , "ptr*", handle)
    }

    WlanEnumInterfaces(handle, ByRef pInterfaceList) {
        DllCall("wlanapi.dll\WlanEnumInterfaces"
            , "ptr", handle
            , "ptr", 0
            , "ptr*", pInterfaceList)
    }

В переменной pInterfaceList будет указатель на структуру WLAN_INTERFACE_INFO_LIST. Создавать её не надо, её создаст вызываемая функция. А данные получать, используя NumGet, в соответствии с устройством этой структуры. Потом структуру нужно удалить, используя функцию WlanFreeMemory.

Это всё я извлёк из описаний, т.к. вайфая нет и проверить не могу.

3 (изменено: MandarinKa02, 2018-01-31 21:43:59)

Re: AHK: DllCall WlanOpenHandle WlanEnumInterfaces

YMP, большое спасибо за помощь. Не могли бы вы также помочь разобрать структуру WLAN_INTERFACE_INFO_LIST?
Пробовал получить первое значение DWORD(int32), но каждый раз возвращаются разные значения.

NumGet(pInterfaceList, 0, "Int")

И еще, в документации сказано, что WLAN_INTERFACE_INFO InterfaceInfo[]; - массив. Если вызвать функцией StrGet(), то в переменную поместиться массив?

Покинул форум

4

Re: AHK: DllCall WlanOpenHandle WlanEnumInterfaces

Надо показать, что читать нужно не из самой переменной, а по адресу, который в ней содержится.


NumGet(pInterfaceList + 0, 0, "Int")

StrGet'ом этот массив не извлечь. Нужно вычислять смещения нужных значений и считывать их индивидуально.

5 (изменено: MandarinKa02, 2018-01-31 22:58:08)

Re: AHK: DllCall WlanOpenHandle WlanEnumInterfaces

Нашел очень полезную информацию о структурах - https://maul-esel.github.io/ahkbook/en/Structures.html
В конечном итоге функция выглядит так:


WlanEnumInterfaces(handle) {
		DllCall("wlanapi.dll\WlanEnumInterfaces"
			, "ptr", handle
			, "ptr", 0
			, "ptr*", pInterfaceList)
		array := []
		loop % (N:=NumGet(pInterfaceList+0, 0, "UInt")) { ; Count of WiFi devices
			i:=A_Index-1, offset:=i*(288)
			;0 - GUID
			;1 - Description
			;2 - State
			array[i, 0] := NumGet(pInterfaceList+0,  offset+8,   "UChar")
			array[i, 1] := StrGet(pInterfaceList+24, offset+256, "UTF-8")
			array[i, 2] := NumGet(pInterfaceList+0,  offset+280, "UInt")
		}
		return (!N?0:array)
	}

Позже выложу рабочий пример.

Покинул форум