獲取某一工作組內計算機列表 - 請問程式哪裡錯誤? |
答題得分者是:jow
|
pcboy
版主 發表:177 回覆:1838 積分:1463 註冊:2004-01-13 發送簡訊給我 |
這是 用 WnetOpenEnum 獲取某一工作組內計算機列表 的 程式, Compile 可過,
程式在附件, 問題似乎在這行, 不知道該如何修正, 可否指教一下, THX ret := WNetEnumResource(hRes,count,buf,bufSize);
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案! 子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問! |
jow
尊榮會員 發表:66 回覆:751 積分:1253 註冊:2002-03-13 發送簡訊給我 |
在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); |
pcboy
版主 發表:177 回覆:1838 積分:1463 註冊:2004-01-13 發送簡訊給我 |
http://topic.csdn.net/t/20010925/20/302688.html
原網址有人說要 mark 掉 就算不 mark 掉, Memo 也只顯示了 finish, 沒有顯示 PC 列表
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案! 子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問! |
jow
尊榮會員 發表:66 回覆:751 積分:1253 註冊:2002-03-13 發送簡訊給我 |
個人認為是該配置而沒有配置, 所引發的問題
以下稍微整理一下程式碼, 謹供參考 [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 發送簡訊給我 |
|
jow
尊榮會員 發表:66 回覆:751 積分:1253 註冊:2002-03-13 發送簡訊給我 |
老實說, 個人之前沒有這方面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] 程式碼僅供參考.... |
pcboy
版主 發表:177 回覆:1838 積分:1463 註冊:2004-01-13 發送簡訊給我 |
列出網路類型, 以及其中所有工作群組 , 供大家參考
現在想知道 如何列出 工作群組 中有哪些電腦 ? 甚至更進一步列出每台電腦有哪些資源分享 ? [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 發送簡訊給我 |
最後改出來的版本, 可以去下面網址直接下載 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]
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案! 子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問! |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |