【发布时间】:2012-03-03 03:50:10
【问题描述】:
我正在将 Native WiFi API 的 WinAPI 转换为 delphi,并在按钮内编写了一个 rotine 进行测试,它工作正常。但不是在程序中工作,我不知道为什么,因为我只是复制和粘贴。
这段代码可以正常工作
procedure TForm1.Button1Click(Sender: TObject);
var
nVersion:DWORD;
clientHandle:HWND;
return:DWORD;
size:DWORD;
pdata:pWLAN_HOSTED_NETWORK_CONNECTION_SETTINGS;
vtype:pWLAN_OPCODE_VALUE_TYPE;
pfail:PWLAN_HOSTED_NETWORK_REASON;
ssid:array[0..DOT11_SSID_MAX_LENGTH] of UCHAR;
name:String;
begin
return:=WlanOpenHandle(2,nil,@nVersion,@clientHandle);
return:=WlanHostedNetworkQueryProperty(clientHandle,wlan_hosted_network_opcode_connection_settings,@size,@pdata,@vtype,nil);
if return<>ERROR_SUCCESS then ShowMessage('Returned ERROR '+ IntToStr(return));
name:=Edit1.Text;
StrCopy(@pdata.hostedNetworkSSID.ucSSID, @name[1]);
pdata.hostedNetworkSSID.uSSIDLength:=Length(name);
return:=WlanOpenHandle(2,nil,@nVersion,@clientHandle);
return:=WlanHostedNetworkSetProperty(clientHandle,wlan_hosted_network_opcode_connection_settings,size,pdata,@pfail,nil);
if return<>ERROR_SUCCESS then ShowMessage('Returned ERROR '+ IntToStr(return));
end;
但是如果将此代码放在另一个过程中以使代码干净并在按钮内调用函数,则它不起作用!
procedure setSSID(text:String);
var
nVersion:DWORD;
clientHandle:HWND;
return:DWORD;
size:DWORD;
pdata:pWLAN_HOSTED_NETWORK_CONNECTION_SETTINGS;
vtype:pWLAN_OPCODE_VALUE_TYPE;
pfail:PWLAN_HOSTED_NETWORK_REASON;
ssid:array[0..DOT11_SSID_MAX_LENGTH] of UCHAR;
name:String;
begin
return:=WlanOpenHandle(2,nil,@nVersion,@clientHandle);
return:=WlanHostedNetworkQueryProperty(clientHandle,wlan_hosted_network_opcode_connection_settings,@size,@pdata,@vtype,nil);
if return<>ERROR_SUCCESS then ShowMessage('Returned ERROR' + IntToStr(return)); <<<<<< RETURNING ERROR 1734
name:=text;
StrCopy(@pdata.hostedNetworkSSID.ucSSID, @name[1]);
pdata.hostedNetworkSSID.uSSIDLength:=Length(name);
return:=WlanOpenHandle(2,nil,@nVersion,@clientHandle);
return:=WlanHostedNetworkSetProperty(clientHandle,wlan_hosted_network_opcode_connection_settings,size,pdata,@pfail,nil);
if return<>ERROR_SUCCESS then ShowMessage('Returned ERROR '+ IntToStr(return));
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
setSSID('test');
end;
我在突出显示的行上收到错误 1734,在收到 Access violation at address 004084D0 in module Project1.exe. Write of address 000000000. 之后出现错误
我只是找不到任何问题,因为是完全相同的代码!
function WlanHostedNetworkQueryProperty(
hClientHandle:HANDLE;
OpCode:WLAN_HOSTED_NETWORK_OPCODE;
pdwDataSize:PDWORD;
ppvData:PPVOID;
pWlanOpcodeValueType:PWLAN_OPCODE_VALUE_TYPE;
pvReserved:PVOID
):DWORD; stdcall; external 'Wlanapi.dll';
function WlanHostedNetworkSetProperty(
hClientHandle:HANDLE;
OpCode:WLAN_HOSTED_NETWORK_OPCODE;
dwDataSize:DWORD;
pvData:PVOID;
pFailReason:PWLAN_HOSTED_NETWORK_REASON;
pvReserved:PVOID
):DWORD; stdcall; external 'Wlanapi.dll';
** OBS:如果我将行 name:=text; 更改为 name:='hello'; 它可以工作!而且我仍然不知道为什么,可能与指针和内存溢出有关。**
【问题讨论】:
-
请显示调用
setSSID()的代码。你要传递什么给text? -
@RemyLebeau-TeamB 编辑了我的问题,但我基本上从同一个按钮调用,我只是 CTRL+X 代码和 CTRL+V 在外部函数上并从该按钮调用。神秘地不起作用。
-
该 API 函数的 MSDN 文档不正确。请参阅文档底部的我的评论。这可能是问题所在。您能否将您的 WlanHostedNetworkQueryProperty 声明添加到问题中,然后我们将能够解决问题。哦,类型定义也会有所帮助。
-
你还有兴趣解决这个问题吗?
-
其实,我刚刚回头看了你之前的问题,发现了这个:stackoverflow.com/questions/9344980/… 难怪这个问题似曾相识。我不明白您为什么按照您的方式翻译 API 函数。我敦促您重新阅读我对您之前问题的回答并遵循该建议。
标签: delphi winapi pointers stack-overflow access-violation