我在做 使用POPUP发送信息(delphi)时,在给它的IP赋值时,不能循环给它赋值,我给他一个循环,要它循环20次,就结束,但是却出现了无限循环,不知道为什么,求解
unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Buttons, StdCtrls;type
  TForm1 = class(TForm)
    SpeedButton2: TSpeedButton;
    SpeedButton1: TSpeedButton;
    GroupBox1: TGroupBox;
    Memo1: TMemo;
    Label1: TLabel;
    Edit1: TEdit;
    procedure SpeedButton1Click(Sender: TObject);
    procedure SpeedButton2Click(Sender: TObject);
  private
    { Private declarations }  public
    { Public declarations }
    function ToUnicode(str: string;dest:PWidechar):integer;
    function SendMsg(ToStr,FromStr,Msg:string):integer;
  
  end;var
  Form1: TForm1;//API函数
function NetMessageBufferSend(servername:PWideChar;
                              MsgName:PWideChar;
                              FromName:PWideChar;
                              Buf:PWideChar;
                              var BufLen:integer):integer;cdecl;
//调用Dll文件
function NetMessageBufferSend;external 'netapi32.dll' name 'NetMessageBufferSend';implementation{$R *.dfm}function TForm1.SendMsg(ToStr, FromStr, Msg: string): integer;
var
  ToName:array [0..64] of WideChar;
  WMsgText:array [0..1000] of WideChar;
  MsgLen,i:integer;
begin
  for i:=0 to 64 do ToName[i]:=#0;//NULL
    ToUnicode(ToStr,ToName);
  for i:=0 to 1000 do WMsgText[i]:=#0;//NULL
    ToUnicode(Msg,WMsgText);  Result:=NetMessageBufferSend(nil,ToName,nil,@WMsgText,MsgLen)
end;function TForm1.ToUnicode(str: string; dest: PWidechar): integer;
var
  len:integer;
begin
  len := 0;
  StringtoWidechar(str,dest,255);
  result:=len;
end;procedure TForm1.SpeedButton1Click(Sender: TObject);
var
   t,k,s:integer;
  a:string;
begin
  t:=1 ;  try
    for  k:=1 to 20  do
    begin
      if t<200 then
      begin
        a:='192.168.1.'+inttostr(t);
        SendMsg(a,'jason',Memo1.text);
        showmessage(a);
        inc(t);
      end
      else
      begin
        exit;
      end;    end;  except
    Exit;
  end;
end;procedure TForm1.SpeedButton2Click(Sender: TObject);
begin
  close;
end;end.

解决方案 »

  1.   

    DLL调用规范有点问题。  //API函数
      //把cdecl改成stdcall就行啦!你试试!
    function NetMessageBufferSend(servername:PWideChar;
      MsgName:PWideChar;
      FromName:PWideChar;
      Buf:PWideChar;
      var BufLen:integer):integer;stdcall;
    //调用Dll文件
    function NetMessageBufferSend;external 'netapi32.dll' name 'NetMessageBufferSend';
      

  2.   

    请问下你第一条小心能不能发送出去 你跟踪下看看showmessage(a) 出来没有  这样就可以断定你是循环出错还是调用出错了
      

  3.   

    按一下按钮要执行20*200 = 4000次NetMessageBufferSend调用,20*200*(1000+64)=4256000次数组成员赋值。lz的上述代码不会造成死循环,倒有可能没按一次按钮都会让电脑休眠好一会儿。lz误以为那是死循环?