gpt4 book ai didi

delphi - 如何在 Delphi 中使用 "Native Wifi API"Windows API 函数

转载 作者:行者123 更新时间:2023-12-03 15:17:36 30 4
gpt4 key购买 nike

我尝试在delphi上使用Windows API的函数,Windows Wlanapi.dll( native WIFI API)的函数

WlanOpenHandle

DWORD WINAPI WlanOpenHandle(
__in DWORD dwClientVersion,
__reserved PVOID pReserved,
__out PDWORD pdwNegotiatedVersion,
__out PHANDLE phClientHandle
);

WlanHostedNetworkQueryProperty

DWORD WINAPI WlanHostedNetworkQueryProperty(
__in HANDLE hClientHandle,
__in WLAN_HOSTED_NETWORK_OPCODE OpCode,
__out PDWORD pdwDataSize,
__out PVOID *ppvData,
__out PWLAN_OPCODE_VALUE_TYPE *pWlanOpcodeValueType,
__reserved PVOID pvReserved
);

我尝试使用此功能和其他功能几个小时,阅读 MSDN 引用资料和其他网站,但我就是无法使其正常工作。

我的尝试

type

TWlanOpenHandle = function( dwClientVersion:DWORD;
pReserved:Pointer;
pdwNegotiatedVersion:PDWORD;
phClientHandle:PHANDLE
):DWORD; stdcall;

function apiWlanOpenHandle( dwClientVersion:DWORD;
pReserved:Pointer;
pdwNegotiatedVersion:PDWORD;
phClientHandle:PHANDLE
):DWORD;


implementation

function apiWlanOpenHandle ( dwClientVersion:DWORD; pReserved:Pointer; pdwNegotiatedVersion:PDWORD; phClientHandle:PHANDLE ):DWORD;
var
WlanOpenHandle: TWlanOpenHandle;
DLL: Cardinal;
begin
DLL:=LoadLibrary('Wlanapi.dll');
WlanOpenHandle := GetProcAddress(DLL, 'WlanOpenHandle');
if Assigned(WlanOpenHandle) then
begin
WlanOpenHandle(dwClientVersion, pReserved, pdwNegotiatedVersion, phClientHandle);
end
else begin
ShowMessage('Function not found');
end;
end;

我正在尝试翻译这个API,看起来工作量很大,而且我只是delphi的初学者,我在网上看了很多东西,我该如何处理这个OpCode 参数,似乎是一个带有常量的 C 结构,以及 PWLAN_OPCODE_VALUE_TYPE?

http://msdn.microsoft.com/en-us/library/windows/desktop/dd439502(v=vs.85).aspx

最佳答案

您实际上并没有展示如何调用apiWlanOpenHandle,我认为这可以解释问题所在。然而,有一个非常常见的错误很可能会让您感到困惑。

考虑 API 的 C 声明:

DWORD WINAPI WlanOpenHandle(
__in DWORD dwClientVersion,
__reserved PVOID pReserved,
__out PDWORD pdwNegotiatedVersion,
__out PHANDLE phClientHandle
);

我怀疑导致您出现问题的参数是最后两个。让我们考虑一下pdwNegotiatedVersion。这是一个指向DWORD的指针。因为这是一个输出参数,所以您必须提供一个指向有效内存的指针。我怀疑您只是声明了一个 PDWORD 类型的变量并传递它。

var
NegotiatedVersionPtr: PDWORD;
begin
WlanOpenHandle(...., NegotiatedVersionPtr, ...);

函数WlanOpenHandle然后取消对该指针的引用并尝试写入内存。如果您没有给出有效的指针,那么这将失败。

最简单的解决方案是将调用代码更改为如下所示:

var
NegotiatedVersion: DWORD;
NegotiatedVersionPtr: PDWORD;
begin
NegotiatedVersionPtr := @NegotiatedVersion;
WlanOpenHandle(...., NegotiatedVersionPtr, ...);

这可行,但还有更简洁的方法。像这样声明 API 导入:

function WlanOpenHandle(
dwClientVersion: DWORD;
pReserved: Pointer;
out NegotiatedVersion: DWORD;
out ClientHandle: THandle
): DWORD; stdcall; external 'Wlanapi.dll';

DWORD 类型的 out 参数实际上作为指针传递给您作为参数提供给函数调用的 DWORD。然后,您可以将调用代码更改为如下所示:

var
ReturnValue: DWORD;
NegotiatedVersion: DWORD;
ClientHandle: THandle;
begin
ReturnValue := WlanOpenHandle(2, nil, NegotiatedVersion, ClientHandle);
if ReturnValue<>ERROR_SUCCESS then
//respond to error

请注意,我还添加了一些您确实应该执行的错误检查。

Windows API函数使用指针声明的原因是C语言只支持按值传递参数。它根本没有引用传递,即 Delphi 术语中的 outvar。支持传递引用的语言应该尽可能使用它们。

某些 Windows API 函数具有声明为指针的可选参数。在这种情况下,传递 NULL 作为指针是表明您不希望传递参数的方法。将这些 API 转换为 Delphi 更为复杂。您需要使用指针实现一个版本,以允许调用者选择不提供参数。但为了方便调用者,提供使用 outvar 的重载版本会很有帮助。 Delphi Windows 单元包含许多这样的示例。

<小时/>

至于WlanHostedNetworkQueryProperty,我会这样声明:

const
// WLAN_HOSTED_NETWORK_OPCODE constants
wlan_hosted_network_opcode_connection_settings = 0;
wlan_hosted_network_opcode_security_settings = 1;
wlan_hosted_network_opcode_station_profile = 2;
wlan_hosted_network_opcode_enable = 3;

// WLAN_OPCODE_VALUE_TYPE constants
wlan_opcode_value_type_query_only = 0;
wlan_opcode_value_type_set_by_group_policy = 1;
wlan_opcode_value_type_set_by_user = 2;
wlan_opcode_value_type_invalid = 3;


function WlanHostedNetworkQueryProperty(
hClientHandle: THandle;
OpCode: Integer;
out DataSize: DWORD;
out Data: Pointer;
out WlanOpcodeValueType: Integer;
Reserved: Pointer
): DWORD; external 'Wlanapi.dll' delayed;

我使用了延迟工具,因为这是Windows 7及更高版本的API。您可能希望您的程序在旧版本的 Windows 上运行,因此需要延迟加载。有关 Delphi 中延迟加载的更多信息,请参阅 this answer ,特别是前进的链接。

请注意,您链接到的 MSDN 主题中的文档不正确。 MSDN 主题中的 pWlanOpcodeValueType 参数声明不正确。正确的定义,在wlanpi.h中找到的是这样的:

__out    PWLAN_OPCODE_VALUE_TYPE     pWlanOpcodeValueType,

关于delphi - 如何在 Delphi 中使用 "Native Wifi API"Windows API 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9344980/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com