全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1989
推到 Plurk!
推到 Facebook!

獲取某一工作組內計算機列表 - 請問程式哪裡錯誤?

答題得分者是:jow
pcboy
版主


發表:177
回覆:1838
積分:1463
註冊:2004-01-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-11-19 10:11:04 IP:61.220.xxx.xxx 訂閱
這是 用 WnetOpenEnum 獲取某一工作組內計算機列表 的 程式, Compile 可過, 
程式在附件, 問題似乎在這行, 不知道該如何修正, 可否指教一下, THX

ret := WNetEnumResource(hRes,count,buf,bufSize);
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案!

子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問!
jow
尊榮會員


發表:66
回覆:751
積分:1253
註冊:2002-03-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-11-19 10:37:43 IP:210.66.xxx.xxx 訂閱
在D7下 Compile Warning 就有指出, 在下列
位置的 buf 是尚未初始化...., 被Mark 掉了...

Variable 'buf' might not have been initialized.




// count := $ffffff;
// bufSize := 4096;
// GetMem(buf,bufSize);
ret := WNetEnumResource(hRes,count,buf,bufSize);
if (ret<>NO_ERROR) or (count<1) then
begin //失敗或者0個項目
GetGroupList := false;
freeMem(buf); <<<-----------Exception 出在這裡
WnetCloseEnum(hRes);
exit;
end;

===================引 用 pcboy 文 章===================
這是 用 WnetOpenEnum 獲取某一工作組內計算機列表 的 程式, Compile 可過,
程式在附件, 問題似乎在這行, 不知道該如何修正, 可否指教一下, THX

ret := WNetEnumResource(hRes,count,buf,bufSize);
編輯記錄
jow 重新編輯於 2007-11-19 10:39:33, 註解 無‧
jow 重新編輯於 2007-11-19 10:41:51, 註解 無‧
pcboy
版主


發表:177
回覆:1838
積分:1463
註冊:2004-01-13

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-11-19 11:04:32 IP:61.220.xxx.xxx 訂閱
http://topic.csdn.net/t/20010925/20/302688.html
原網址有人說要 mark 掉
就算不 mark 掉, Memo 也只顯示了 finish, 沒有顯示 PC 列表
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案!

子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問!
jow
尊榮會員


發表:66
回覆:751
積分:1253
註冊:2002-03-13

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-11-19 12:54:32 IP:210.66.xxx.xxx 訂閱
個人認為是該配置而沒有配置, 所引發的問題
以下稍微整理一下程式碼, 謹供參考



[code delphi]
unit Unit1;

interface
uses
Windows, Forms, StdCtrls, Classes, Controls;

type

TArrayOfNetRes = array of TNetResource;

TForm1 = class(TForm)
Memo1: TMemo;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
function GetGroupList(r: PNetResourceA; var A: TArrayOfNetRes): boolean;
end;

var
Form1: TForm1;
[/code]



[code delphi]
implementation

{$R *.dfm}
//-----------------------------------------------------------------------------
function TForm1.GetGroupList(r: PNetResourceA; var A: TArrayOfNetRes): boolean;
var
hRes: Thandle;
buf: Pointer;
bufSize, count: Cardinal;
begin
A := nil;
if WnetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY,
RESOURCEUSAGE_CONTAINER, r, hRes) = NO_ERROR then
try
count := $FFFFFFFF;
bufSize := 4096;
GetMem(buf, bufSize);
try
if(WNetEnumResource(hRes, count, buf, bufSize) = NO_ERROR) and
(count > 0) then
begin
SetLength(A, count);
Move(buf^, Pointer(A)^, SizeOf(TNetResource)*count);
end;
finally
FreeMem(buf, bufSize);
end;
finally
WNetCloseEnum(hRes);
end;
Result := A <> nil;
end;
//-----------------------------------------------------------------------------
procedure TForm1.Button1Click(Sender: TObject);
var
I: Integer;
A: TArrayOfNetRes;
begin
Memo1.Clear;
if GetGroupList(nil, A) then
try
for I := 0 to Length(A)-1 do
Memo1.Lines.Add(A[I].lpRemoteName);
Memo1.Lines.SaveToFile('D:\RESULT.TXT');
finally
A := nil;
end;
end;
//-----------------------------------------------------------------------------

end.
[/code]

執行結果: Memo1.Lines.Text 內容 ('D:\RESULT.TXT')

Microsoft Terminal Services
Microsoft Windows Network
Web Client Network



===================引 用 pcboy 文 章===================
http://topic.csdn.net/t/20010925/20/302688.html
原網址有人說要 mark 掉
就算不 mark 掉, Memo 也只顯示了 finish, 沒有顯示 PC 列表
pcboy
版主


發表:177
回覆:1838
積分:1463
註冊:2004-01-13

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-11-19 13:34:47 IP:61.220.xxx.xxx 訂閱
請問一下, 如果要列出 
Microsoft Terminal Services
Microsoft Windows Network
Web Client Network
中有哪些群組 ?
以及群組中各有哪些電腦 ?
程式該如何改 ?
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案!

子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問!
jow
尊榮會員


發表:66
回覆:751
積分:1253
註冊:2002-03-13

發送簡訊給我
#6 引用回覆 回覆 發表時間:2007-11-19 15:10:27 IP:210.66.xxx.xxx 訂閱
老實說, 個人之前沒有這方面coding的經驗,
而我稍微看了一下 on-line W32 SDK Help,


以下是我初步的"猜想":
(1)第一次叫用GetGroupList(), 取得 根節點及其下之支點(NETWORK)
(2)以(1)取得的資料, 再一次叫用GetGroupList(), 取得某NETWORK下的GROUP
(3)最後以(2)取得的資料, 再使用GetGroupList(), 取得某GROUP下的電腦相關訊息

要注意的是, 以下程式碼是亂猜的:
我想在叫用GetGroupList()過程中,
可能還是需加上一些資源型態上的
判斷吧....


[code delphi]
//-----------------------------------------------------------------------------
procedure TForm1.Button2Click(Sender: TObject);
var
I, J, K: Integer;
A, B, C: TArrayOfNetRes;
begin
Memo1.Clear;
if GetGroupList(nil, A) then
try
for I := 0 to Length(A)-1 do
begin//NETWORK
Memo1.Lines.Add(A[I].lpRemoteName);
if GetGroupList(@A[I], B) then
try
for J := 0 to Length(B)-1 do
begin//GROUP
Memo1.Lines.Add(' ' B[J].lpRemoteName);
if GetGroupList(@B[J], C) then
try//PC-LIST
for K := 0 to Length(C)-1 do
Memo1.Lines.Add(' ' C[K].lpRemoteName);
finally
C := nil;
end;
end;
finally
B := nil;
end;
end;
Memo1.Lines.SaveToFile('D:\RESULT.TXT');
finally
A := nil;
end;
end;
//-----------------------------------------------------------------------------
[/code]

程式碼僅供參考....


編輯記錄
jow 重新編輯於 2007-11-19 15:11:54, 註解 無‧
jow 重新編輯於 2007-11-19 15:32:28, 註解 無‧
pcboy
版主


發表:177
回覆:1838
積分:1463
註冊:2004-01-13

發送簡訊給我
#7 引用回覆 回覆 發表時間:2007-11-22 12:17:55 IP:61.220.xxx.xxx 訂閱
列出網路類型, 以及其中所有工作群組 , 供大家參考
現在想知道 如何列出 工作群組 中有哪些電腦 ? 甚至更進一步列出每台電腦有哪些資源分享 ?
[code cpp]
// 列出網路類型, 以及其中所有工作群組
// http://topic.csdn.net/t/20000912/09/29571.html
// Delphi 7 Enterprise
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Memo1: TMemo;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
type
TNetResourceArray = ^TNetResource; // 網路類型
Var
NetResource : TNetResource;
Buf : Pointer;
Count,BufSize,Res : DWORD;
lphEnum : THandle;
p : TNetResourceArray;
i,j : SmallInt;
procedure TForm1.FormCreate(Sender: TObject);
Var
NetworkTypeList : TList;
NetResource : TNetResource;
Buf : Pointer;
Count,BufSize,Res : DWORD;
lphEnum : THandle;
p : TNetResourceArray;
i,j : SmallInt;
WorkGroupList : TStringList;
List : TStringList;
Begin
Memo1.Clear;
NetworkTypeList := TList.Create;
List := TStringList.Create;
List.Clear;
//獲取整個網絡中的文件資源的句柄,lphEnum為返回名柄
{The WNetOpenEnum function starts an enumeration of network resources or existing connections.
DWORD WNetOpenEnum(
DWORD dwScope, // scope of enumeration
DWORD dwType, // resource types to list
DWORD dwUsage, // resource usage to list
LPNETRESOURCE lpNetResource, // pointer to resource structure
LPHANDLE lphEnum // pointer to enumeration handle buffer
);
}
Res := WNetOpenEnum( RESOURCE_GLOBALNET, RESOURCETYPE_DISK,
RESOURCEUSAGE_CONTAINER, Nil,lphEnum);
If Res <> NO_ERROR Then exit;//Raise Exception(Res);//執行失敗
//獲取整個網絡中的網路類型信息
Count := $FFFFFFFF;//不限資源數目
BufSize := 8192;//緩衝區大小設置為8K
GetMem(Buf, BufSize);//申請內存,用於獲取工作組信息
{
DWORD WNetEnumResource(
HANDLE hEnum, // handle to enumeration
LPDWORD lpcCount, // pointer to entries to list
LPVOID lpBuffer, // pointer to buffer for results
LPDWORD lpBufferSize // pointer to buffer size variable
);
}
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]^);//網路類型信息
Memo1.Lines.Add('NetResource.dwScope : ' IntToStr(NetResource.dwScope));
Memo1.Lines.Add('NetResource.dwType : ' IntToStr(NetResource.dwType));
Memo1.Lines.Add('NetResource.dwDisplayType : ' IntToStr(NetResource.dwDisplayType));
Memo1.Lines.Add('NetResource.dwUsage : ' IntToStr(NetResource.dwUsage));
Memo1.Lines.Add('NetResource.lpLocalName : ' NetResource.lpLocalName);
Memo1.Lines.Add('NetResource.lpRemoteName : ' NetResource.lpRemoteName);
Memo1.Lines.Add('NetResource.lpComment : ' NetResource.lpComment);
Memo1.Lines.Add('NetResource.lpProvider : ' NetResource.lpProvider);
Memo1.Lines.Add('---------------------------------------');
//獲取某個網路類型的文件資源的句柄,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 ));//取得一個工作組的名稱
Memo1.Lines.Add('P^.dwScope : ' IntToStr(P^.dwScope));
Memo1.Lines.Add('P^.dwType : ' IntToStr(P^.dwType));
Memo1.Lines.Add('P^.dwDisplayType : ' IntToStr(P^.dwDisplayType));
Memo1.Lines.Add('P^.dwUsage : ' IntToStr(P^.dwUsage));
Memo1.Lines.Add('P^.lpLocalName : ' P^.lpLocalName);
Memo1.Lines.Add('P^.lpRemoteName : ' P^.lpRemoteName);
Memo1.Lines.Add('P^.lpComment : ' P^.lpComment);
Memo1.Lines.Add('P^.lpProvider : ' P^.lpProvider);
Memo1.Lines.Add('---------------------------------------');
Inc(P);
End;
End;
Res := WNetCloseEnum(lphEnum);//關閉一次列舉
If Res <> NO_ERROR Then break;//執行失敗
End;
FreeMem(Buf);
NetworkTypeList.Destroy;
End;
End.
[/code]
===================引 用 pcboy 文 章===================
請問一下, 如果要列出
Microsoft Terminal Services
Microsoft Windows Network
Web Client Network
中有哪些群組 ?
以及群組中各有哪些電腦 ?
程式該如何改 ?
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案!

子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問!
pcboy
版主


發表:177
回覆:1838
積分:1463
註冊:2004-01-13

發送簡訊給我
#8 引用回覆 回覆 發表時間:2007-11-22 16:02:33 IP:61.220.xxx.xxx 訂閱
最後改出來的版本, 可以去下面網址直接下載 Source Code

顯示區域網路中有哪些網路型態, 工作群組, 電腦, 分享目錄(含SourceCode)
http://delphi.ktop.com.tw/board.php?cid=31&fid=79&tid=91391

完整程式直接列於此
[code cpp]
// 顯示網路型態 NetworkType (Microsoft Terminal Services, Microsoft Windows Network, Web Client Network)
// 顯示工作群組 WorkGroup Name (例如 Microsoft Windows Network 中的 WorkGroup, WorkGroup2)
// 顯示電腦名稱 Computer Name (例如 WorkGroup 中的 Tony, Peter)
// 顯示電腦分享的目錄
// 開發工具 Delphi 7 Enterprise
// Ref :
// http://www.infojet.cz/program/delphi/tips/tip0012.html
// 2007/11/22
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Memo1: TMemo;
procedure FormCreate(Sender: TObject);
function FindComputers: DWORD;
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
Computers: TStringList;
const
MaxEntries = 250;

implementation
{$R *.dfm}
function TForm1.FindComputers: DWORD;
var
EnumWorkGroupHandle,
EnumComputerHandle : THandle;
EnumPCHandle : THandle;
EnumDirHandle : THandle;
EnumError : DWORD;
Network : TNetResource;
WorkGroupEntries,
ComputerEntries : DWORD;
PCEntries : DWORD;
DirEntries : DWORD;
EnumWorkGroupBuffer,
EnumComputerBuffer : array[1..MaxEntries] of TNetResource;
EnumPCBuffer : array[1..MaxEntries] of TNetResource;
EnumDirBuffer : array[1..MaxEntries] of TNetResource;
EnumBufferLength : DWORD;
I, J, K, L : DWORD;
begin
Computers.Clear;
FillChar(Network, SizeOf(Network), 0);
with Network do
begin
dwScope := RESOURCE_GLOBALNET;
dwType := RESOURCETYPE_ANY;
dwUsage := RESOURCEUSAGE_CONTAINER;
end;
EnumError := WNetOpenEnum(RESOURCE_GLOBALNET,
RESOURCETYPE_ANY, 0,
@Network,
EnumWorkGroupHandle);
if EnumError = NO_ERROR then
begin
WorkGroupEntries := MaxEntries;
EnumBufferLength := SizeOf(EnumWorkGroupBuffer);
EnumError := WNetEnumResource(EnumWorkGroupHandle,
WorkGroupEntries,
@EnumWorkGroupBuffer,
EnumBufferLength);
if EnumError = NO_ERROR then
begin
for I := 1 to WorkGroupEntries do
begin
Memo1.Lines.Add(EnumWorkGroupBuffer[I].lpProvider);
EnumError := WNetOpenEnum(RESOURCE_GLOBALNET,
RESOURCETYPE_ANY, 0,
@EnumWorkGroupBuffer[I],
EnumComputerHandle);
if EnumError = NO_ERROR then
begin
ComputerEntries := MaxEntries;
EnumBufferLength:= SizeOf(EnumComputerBuffer);
EnumError:=WNetEnumResource(EnumComputerHandle,
ComputerEntries,
@EnumComputerBuffer,
EnumBufferLength);
if EnumError = NO_ERROR then
for J := 1 to ComputerEntries do
begin
Computers.Add(Copy(EnumComputerBuffer[J].
lpRemoteName, 3, Length(EnumComputerBuffer[J].
lpRemoteName) - 2));
Memo1.Lines.Add(EnumComputerBuffer[J].lpRemoteName);
//-----------------
EnumError := WNetOpenEnum(RESOURCE_GLOBALNET,
RESOURCETYPE_ANY, 0,
@EnumComputerBuffer[J],
EnumPCHandle);
if EnumError = NO_ERROR then
begin
PCEntries := MaxEntries;
EnumBufferLength:= SizeOf(EnumPCBuffer);
EnumError:=WNetEnumResource(EnumPCHandle,
PCEntries,
@EnumPCBuffer,
EnumBufferLength);
if EnumError = NO_ERROR then
for K := 1 to PCEntries do
begin
{
Computers.Add(Copy(EnumComputerBuffer[J].
lpRemoteName, 3, Length(EnumComputerBuffer[J].
lpRemoteName) - 2));
}
Memo1.Lines.Add(EnumPCBuffer[K].lpRemoteName);
// *********************************************
EnumError := WNetOpenEnum(RESOURCE_GLOBALNET,
RESOURCETYPE_ANY, 0,
@EnumPCBuffer[K],
EnumDirHandle);
if EnumError = NO_ERROR then
begin
DirEntries := MaxEntries;
EnumBufferLength:= SizeOf(EnumDirBuffer);
EnumError:=WNetEnumResource(EnumDirHandle,
DirEntries,
@EnumDirBuffer,
EnumBufferLength);
if EnumError = NO_ERROR then
for L := 1 to DirEntries do
begin
{
Computers.Add(Copy(EnumComputerBuffer[J].
lpRemoteName, 3, Length(EnumComputerBuffer[J].
lpRemoteName) - 2));
}
Memo1.Lines.Add(EnumDirBuffer[L].lpRemoteName);
end;
end;
// *********************************************
end;
end;
//--------------
end;
WNetCloseEnum(EnumComputerHandle);
end;
end;
end;
WNetCloseEnum(EnumWorkGroupHandle);
end;
if EnumError = ERROR_NO_MORE_ITEMS then
EnumError := NO_ERROR;
Result := EnumError;
end;
procedure TForm1.FormCreate(Sender: TObject);
var
i: Integer;
begin
Memo1.Clear;
Computers := TStringList.Create;
FindComputers;
{
for i:=0 to Computers.Count -1 do
begin
Memo1.Lines.Add(Computers.Strings[i]);
end;
}
Memo1.Lines.Add('Finish!');
Computers.Free;
end;
end.
[/code]
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案!

子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問!
系統時間:2024-04-29 9:16:15
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!