Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 为什么这段代码在按钮中工作,而不是在单个过程中工作?_Delphi_Winapi_Pointers_Stack Overflow_Access Violation - Fatal编程技术网

Delphi 为什么这段代码在按钮中工作,而不是在单个过程中工作?

Delphi 为什么这段代码在按钮中工作,而不是在单个过程中工作?,delphi,winapi,pointers,stack-overflow,access-violation,Delphi,Winapi,Pointers,Stack Overflow,Access Violation,我正在将本机WiFi API的WinAPI转换为delphi,我在一个按钮内编写了一个rotine进行测试,它成功了。但在程序中不起作用,我不知道为什么,因为我只是复制和粘贴 这正是代码在工作 procedure TForm1.Button1Click(Sender: TObject); var nVersion:DWORD; clientHandle:HWND; return:DWORD; size:DWORD; pdata:pWLAN_HOSTED_NETWORK_CONNECTION_SE

我正在将本机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;


**OBS:如果我更改行
name:=文本
名称:='hello'它工作!我仍然不知道为什么,可能与指针和内存溢出有关。**

WlanHostedNetworkQueryProperty函数的文档中指出,调用pData指针时必须将其设置为零。您根本没有初始化它,因此它可能是也可能不是,这取决于堆栈的状态。您需要添加以下行:

pData:=零

在电话之前

您可能需要初始化所有参数


(很抱歉格式不好,在手机上这么做很难!)

我通过另一个问题解决了这个问题

访问冲突是由delphi的正常行为引起的

Delphi字符串的内存管理有点不寻常。你先 调用myFunc(text),并分配textcopy:=mytext,所有三个变量 (text、mytext和textcopy)将指向同一地址,即 原始字符串的

但是一旦你使用这些变量中的一个对 字符串,Delphi在幕后克隆字符串,以及您的更改 应用于副本。其他两个变量仍然指向 原版,所以它们保持不变。因此,在上下文2中所做的任何更改 将不会在上下文1中看到-此“写时复制”机制 有效地为您提供传递值语义。所有这些弦 引用已计数,并将在所有 引用超出范围

但是,有一个异常如果您使用 指针,而不是字符串操作,您将绕过复制 步骤,您的更改将影响原始。您还将绕过 引用计数逻辑和可能以指向 解除分配的内存块。这可能是您访问的原因 违反,但我不能说没有更多的细节/更多的代码

如果希望传递引用,请将函数声明为myFunc(var mytext:String)。如果要强制Delphi复制字符串, 您可以使用 System.UniqueString


原始答案

尝试将所有内容设为零,但我总是会遇到访问冲突,但如果我不使用
名称:=文本使用静态字符串,如
name:='test',就像一个符咒。没有错误这只是告诉我你有堆栈损坏。我坚信API调用正在覆盖堆栈。David关于函数定义不正确的建议似乎最有可能。请显示调用
setSSID()
的代码。你要把什么传递给
text
?@RemyLebeau TeamB编辑了我的问题,但我基本上是从同一个按钮调用的,我只是在外部函数上按CTRL+X和CTRL+V,然后从该按钮调用。神秘地不起作用。该API函数的MSDN文档不正确。请参阅文档底部的我的评论。这可能就是问题所在。您能否将您的WlanHostedNetworkQueryProperty声明添加到问题中,然后我们就可以解决问题了。哦,类型定义也会有帮助。你还对解决这个问题感兴趣吗?事实上,我刚刚回顾了你之前的问题,发现了这个问题:难怪这个问题看起来很熟悉。我不明白你为什么用这种方式翻译API函数。我恳请你重新阅读我对你先前问题的回答,并遵循我的建议。这与问题无关。
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;
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';