在delphi 里按F9运行 当点击 button1 时就会出错,但是在外面直接运行 Project1.exe 点击 button1 就不会出错 ,哪位大哥帮我一下,
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls ;type
TNetResourceArray = ^TNetResource; //网络资源类型的数组
TForm1 = class(TForm)
Memo1: TMemo;
Button1: TButton;
Function GetServerList( var List : TStringList ) : Boolean;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
search = class(TThread)
public
memobuffer:TStringList;
private
{ Private declarations }
protected
constructor create;//(createsuspended:boolean) ;
procedure Execute; override;
procedure Terminate;
end;
var
Form1: TForm1;implementation{$R *.dfm}constructor search.create;//(createsuspended:boolean);
begin
inherited create(false);//(createsuspended);
FreeOnTerminate := true;
memobuffer := TStringList.Create;
end;
procedure search.Execute;
var i:integer;
begin
{ Place thread code here }
showmessage(inttostr(i)); if form1.GetServerList(memobuffer) then
for i:=0 to memobuffer.Count do
begin
form1.Memo1.Lines.Add(memobuffer.Strings[i]);
end ;
end;procedure search.Terminate;
begin
memobuffer.Free;
inherited ;
end ;Function tform1.GetServerList( var List : TStringList ) : Boolean;
Var
NetResource : TNetResource;
Buf : Pointer;
Count,BufSize,Res : DWORD;
lphEnum : THandle;
p:TNetResourceArray;
i,j : SmallInt;
NetworkTypeList : TList;
Begin
Result := False;
NetworkTypeList := TList.Create;
List.Clear;
Res := WNetOpenEnum( RESOURCE_GLOBALNET, RESOURCETYPE_DISK,
RESOURCEUSAGE_CONTAINER, Nil,lphEnum);
//获取整个网络中的文件资源的句柄,lphEnum为返回名柄
If Res <> NO_ERROR Then exit;
//执行失败,退出
//执行成功,开始获取整个网络中的网络类型信息
Count := $FFFFFFFF;
//不限资源数目
BufSize := 8192;
//缓冲区大小设置为8K
GetMem(Buf, BufSize);
//申请内存,用于获取工作组信息
Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);
If ( Res = ERROR_NO_MORE_ITEMS )
//资源列举完毕
or (Res <> NO_ERROR )
//执行失败
Then Exit;
P := TNetResourceArray(Buf);
For I := 0 To Count - 1 Do
//记录各个网络类型的信息
Begin
NetworkTypeList.Add(p);
Inc(P);
End;
//WNetCloseEnum关闭一个列举句柄
Res:= WNetCloseEnum(lphEnum);
//关闭一次列举
If Res <> NO_ERROR Then exit;
For J := 0 To NetworkTypeList.Count-1 Do
//列出各个网络类型中的所有工作组名称
Begin
//列出一个网络类型中的所有工作组名称
NetResource := TNetResource(NetworkTypeList.Items[J]^);
//网络类型信息
//获取某个网络类型的文件资源的句柄,NetResource为网络类型信息,lphEnum为返回名柄
Res := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_DISK,
RESOURCEUSAGE_CONTAINER, @NetResource,lphEnum);
If Res <> NO_ERROR Then break;
//执行失败
While true Do
//列举一个网络类型的所有工作组的信息
Begin
Count := $FFFFFFFF;
//不限资源数目
BufSize := 8192;
//缓冲区大小设置为8K
GetMem(Buf, BufSize);
//申请内存,用于获取工作组信息,获取一个网络类型的文件资源信息,
Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);
If ( Res = ERROR_NO_MORE_ITEMS )
//资源列举完毕
or (Res <> NO_ERROR)
//执行失败
then break;
P := TNetResourceArray(Buf);
For I := 0 To Count - 1 Do
//列举各个工作组的信息
Begin
List.Add( StrPAS( P^.lpRemoteName ));
//取得一个工作组的名称
Inc(P);
End;
End;
Res := WNetCloseEnum(lphEnum);
//关闭一次列举
If Res <> NO_ERROR Then break;
//执行失败
End;
Result := True;
FreeMem(Buf);
NetworkTypeList.Destroy;
End;procedure TForm1.Button1Click(Sender: TObject);
var searchPC : search;begin
searchPC := search.create//(false);
end;end.
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls ;type
TNetResourceArray = ^TNetResource; //网络资源类型的数组
TForm1 = class(TForm)
Memo1: TMemo;
Button1: TButton;
Function GetServerList( var List : TStringList ) : Boolean;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
search = class(TThread)
public
memobuffer:TStringList;
private
{ Private declarations }
protected
constructor create;//(createsuspended:boolean) ;
procedure Execute; override;
procedure Terminate;
end;
var
Form1: TForm1;implementation{$R *.dfm}constructor search.create;//(createsuspended:boolean);
begin
inherited create(false);//(createsuspended);
FreeOnTerminate := true;
memobuffer := TStringList.Create;
end;
procedure search.Execute;
var i:integer;
begin
{ Place thread code here }
showmessage(inttostr(i)); if form1.GetServerList(memobuffer) then
for i:=0 to memobuffer.Count do
begin
form1.Memo1.Lines.Add(memobuffer.Strings[i]);
end ;
end;procedure search.Terminate;
begin
memobuffer.Free;
inherited ;
end ;Function tform1.GetServerList( var List : TStringList ) : Boolean;
Var
NetResource : TNetResource;
Buf : Pointer;
Count,BufSize,Res : DWORD;
lphEnum : THandle;
p:TNetResourceArray;
i,j : SmallInt;
NetworkTypeList : TList;
Begin
Result := False;
NetworkTypeList := TList.Create;
List.Clear;
Res := WNetOpenEnum( RESOURCE_GLOBALNET, RESOURCETYPE_DISK,
RESOURCEUSAGE_CONTAINER, Nil,lphEnum);
//获取整个网络中的文件资源的句柄,lphEnum为返回名柄
If Res <> NO_ERROR Then exit;
//执行失败,退出
//执行成功,开始获取整个网络中的网络类型信息
Count := $FFFFFFFF;
//不限资源数目
BufSize := 8192;
//缓冲区大小设置为8K
GetMem(Buf, BufSize);
//申请内存,用于获取工作组信息
Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);
If ( Res = ERROR_NO_MORE_ITEMS )
//资源列举完毕
or (Res <> NO_ERROR )
//执行失败
Then Exit;
P := TNetResourceArray(Buf);
For I := 0 To Count - 1 Do
//记录各个网络类型的信息
Begin
NetworkTypeList.Add(p);
Inc(P);
End;
//WNetCloseEnum关闭一个列举句柄
Res:= WNetCloseEnum(lphEnum);
//关闭一次列举
If Res <> NO_ERROR Then exit;
For J := 0 To NetworkTypeList.Count-1 Do
//列出各个网络类型中的所有工作组名称
Begin
//列出一个网络类型中的所有工作组名称
NetResource := TNetResource(NetworkTypeList.Items[J]^);
//网络类型信息
//获取某个网络类型的文件资源的句柄,NetResource为网络类型信息,lphEnum为返回名柄
Res := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_DISK,
RESOURCEUSAGE_CONTAINER, @NetResource,lphEnum);
If Res <> NO_ERROR Then break;
//执行失败
While true Do
//列举一个网络类型的所有工作组的信息
Begin
Count := $FFFFFFFF;
//不限资源数目
BufSize := 8192;
//缓冲区大小设置为8K
GetMem(Buf, BufSize);
//申请内存,用于获取工作组信息,获取一个网络类型的文件资源信息,
Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);
If ( Res = ERROR_NO_MORE_ITEMS )
//资源列举完毕
or (Res <> NO_ERROR)
//执行失败
then break;
P := TNetResourceArray(Buf);
For I := 0 To Count - 1 Do
//列举各个工作组的信息
Begin
List.Add( StrPAS( P^.lpRemoteName ));
//取得一个工作组的名称
Inc(P);
End;
End;
Res := WNetCloseEnum(lphEnum);
//关闭一次列举
If Res <> NO_ERROR Then break;
//执行失败
End;
Result := True;
FreeMem(Buf);
NetworkTypeList.Destroy;
End;procedure TForm1.Button1Click(Sender: TObject);
var searchPC : search;begin
searchPC := search.create//(false);
end;end.
解决方案 »
- 用Delphi 写的SQL Server 的数据库网路版该怎么发布?
- 运行时事件执行后我想停止他不知道怎么写代码?
- 如何给DBGridEh1定位,显示不同颜色?
- excel中的数据导入到数据库中
- 关于数据备份和恢复的问题,做毕业设计用,请各位大侠帮助!
- 我想把一个文件从一台计算机传到局域网外的令一台计算机,请问应该怎么做?
- 给我讲讲inherited的用法?
- findwindow怎样得到任务栏句柄?
- PageControl和TabSheet的问题
- 关于《程序员大本营》里的一个控件使用方法请教
- SOCKET,请高手指点,如果知道接受到服务端数据!!!!
- ############支持国产共享软件,请大家投上最神圣的一票!!!!散分
procedure search.Execute;
var i:integer;
begin
{ Place thread code here }
// showmessage(inttostr(i)); if form1.GetServerList(memobuffer) then
for i:=0 to memobuffer.Count-1 do
begin
form1.Memo1.Lines.Add(memobuffer.Strings[i]);
end ;
end;