Get network resource information Wang Haolun in the DELHPI program
Take advantage of shared resources in the LAN will undoubtedly reduce user hardware and software investment. In our program, you often need to list shared resources in a local area network. For example, in the MIDAS multi-layer application, you may want to select the name of the server in the upper layer application, select the available network printer in the print module, in the application Select a shared file on other machines.
With a MIDAS three-layer database application as an example, we can use Delphi to make a client application and an intermediate business handler, which is filed by the intermediate layer service handler to the data, and then feedback to the client. When the client application and the intermediate layer program and the database service program are not on a machine, you need to specify the name of the server in the intermediate layer program and the database service program.
In the Delphi program, we can list the server names in the local area network through the Win API, the user computer name, user sharing directory, and files, shared printers, etc., these APIs are file MPR. DLL is available.
The following is an example in Win9X's peer-to-peer network, enumerating the Working Group name, user computer name, shared directory, and files, sharing printers such as "Network Neighbors".
First, list the workgroup name in "Network Neighbors"
In "Network Neighbors", open "Overall Network", you can see the name of all working groups in the network. In the Delphi program, you can use the API functions WNETOpenENUM and WNETENUMRESOURCE to list the workgroup name in "Network Neighbors".
Below is an introduction to the two API functions, please refer to the Delphi Help file.
// WNETOPENUM is used to obtain a network resource handle, which is the basis for the WNETENUMRESOURCE to list network resources, and its function prototype is as follows:
Function WnetopENENUM
DWSCOPE, // network range, resource_connected, resource_globalnet (all machines),
Resource_remembed (Memory Machine)
DWTYPE, // Resource Type, ResourceType_any (All Resources), ResourceType_Disk (File Resources),
Resourcetype_print (Printing Resources)
Dwusage // Resource Uses, 0 (All Resources), ResourceUsage_Connectable (all accessible resources),
Resourceusage_Container (all container resources) are only valid for resource_globalnet: DWORD;
LpnetResource: PNetResource; // NetResource type pointer, its memory represents the hierarchy of network resources, when nil
Indicates the uppermost layer, only when DWSCOPE is resource_globalnet, it should be NIL when other cases
Var lphenum: THANDLE / / Returns the network resource handle, which is the basis for the WNETENUMRESOURCE to enumerate the network resources): dword; stdcall; return value no_error indicates the execution, otherwise apply getLastError to get an error message
// WseTenumResource is used to list resources available in the current network, including file resources and print resources, which are as follows:
Function WneetenumResource (HENUM: THANDLE; / / WNETENUMRESOURCE further lists the basis of network resources, usually gets var lpcount: dword from WNEToPENENUM; // To get the number of resources, $ ffffff means listing all resources, returning value for actual resources LPBuffer: Pointer; // Receive the pointer of the buffer of the result, generally the number of NetResource types VAR lpbuffersize: DWORD // Buffer size (byte): dword; stdcall; return value is no_error (execution success) or error_no_more_items The resource list is complete), otherwise apply the getLastError to get the error message.
To list the workgroup information in the network, first get the network type in the network, then get the name of the workgroup included in each type of network.
1, get network type information
The local area network can be composed of a variety of types of networks, such as a network of Microsoft, Novell, and the like. Use API
Functions WNETOpenENUM and WNETENUMRESOURCE can get network type information.
(1) Returns a handle with the WNEToPENENUM function, which is the basis for the WNETENUMRESOURCE lists network resources. Our eye
It is the name of the working group of "The entire network", so the network range is Resource_GlobalNet (all machines), resource classes
RESOURTYPE_DISK (file resource), resource use is Resourceusage_Container (all Container resources),
The network level is the highest layer (NIL), which allows a handle to further enumerate network resources. The specific program segment is as follows:
{RES: DWORD; lphenum: thandle;
Res: = WNETOPENUM (Resource_GlobalNet, ResourceType_Disk,
Resourceusage_Container, NIL, LPHENUM;
If res <> no_error thr; // execution failed
(2) Use the API function WNETENUMRESOURCE to get network type information, at which point to use the handle LPhenum,
You can get an array of NetResource types, each NetResource element, is a network type information.
Please refer to the following blocks and comment information.
Type
TNetResourceArray = ^ TNetResource; // Network type array variable VAR
NetResource: TNETRESOURCE;
BUF: POINTER;
Count, BufSize, Res: DWORD
Lphenum: thandle;
P: TNetResourceArray;
I, J: smallint;
NetworkTypelist: TList; Begin
......
Count: = $ fffffff; // Number of unlimited resources
BUFSIZE: = 8192; // Buffer size Set to 8K
GetMem (BUF, BUFSIZE); // Apply for memory for obtaining a working group information res: = WnertenumResource (lphenum, count, pointer (buf); // Get network type information
IF (res = error_no_more_items) // resource list
or (res <> no_error) // Execution failed
.
P: = TNetResourceArray (BUF);
For i: = 0 to count - 1 DO // Record information of each network type
Begin
NetworkTypelist.Add (p);
INC (P);
END;
... End;
2. Get working group information
After getting the network type information, you can get the server (working group) information in this type of network according to this information.
In the WNETOpenenum function, specify the parameter LpNetResource as a network type information, you can get a handle, use this handle in WneetenumResource, you can get a NetResource type array, each NetResource element's LPREMOTENAME section is a workgroup name ( Such as "MyWorkgroup").
Please refer to the following blocks and comment information.
/ / List all the working group names in a network type
NetResource: = TNetResource (NetWorktyPelist.Items [J] ^); // Network Type Information // Gets the handle of file resources for a network type, NetResource is network type information, lphenum is a return handle
Res: = WNETOPENUM (Resource_GlobalNet, ResourceType_Disk,
Resourceusage_container, @ netResource, lphenum;
If res <> no_error dam; // execution failed
While true do // lists information about all working groups of a network type
Begin
Count: = $ fffffff; // Number of unlimited resources
BUFSIZE: = 8192; // Buffer size Set to 8K
GetMem (buf, bufsize); // Apply for memory to obtain workgroup information
// Get a file resource information of a network type,
Res: = WneetenumResource (Lphenum, Count, Pointer (BUF), BUFSIZE
IF (res = error_no_more_items) // resource list
or (res <> no_error) // Execution failed
Then Break;
P: = TNetResourceArray (BUF);
For i: = 0 to count - 1 do // list information from each working group
Begin
List.add (StrPas (p ^ .lpremotename); // get the name of a workgroup
INC (P);
END;
END;
3. Get the full source code of the workgroup information // list the name of the workgroup in the entire network, and the return value indicates that the execution is successful.
// Name of the server (Working Group) in // Parameter list Function 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; // Get the handle of the file resources in the entire network, lphenum is the return handle
Res: = WNETOPENUM (Resource_GlobalNet, ResourceType_Disk,
Resourceusage_Container, NIL, LPHENUM;
If res <> no_error life exit; // raise exception (res); // Execute failed // Get network type information in the entire network
Count: = $ fffffff; // Number of unlimited resources
BUFSIZE: = 8192; // Buffer size Set to 8K
GetMem (buf, bufsize); // Apply for memory to obtain workgroup information
Res: = WneetenumResource (Lphenum, Count, Pointer (BUF), BUFSIZE
IF (res = error_no_more_items) // resource list
or (res <> no_error) // Execution failed
.
P: = TNetResourceArray (BUF);
For i: = 0 to count - 1 DO // Record information of each network type
Begin
NetworkTypelist.Add (p);
INC (P);
END;
// WNETCLOSEENUM Turn off a hook
Res: = WnetCloseenum (lphenum); // Close a list
IF RES <> NO_ERROR THEN EXIT;
For j: = 0 to networktypelist.count-1 do // list all the workgroup names in each network type
Begin // lists all the working group names in a network type
NetResource: = TNetResource (NetWorktyPelist.Items [j] ^); // Network Type Information // Gets the handle of file resources for a network type, NetResource is network type information, lphenum is the return handle
Res: = WNETOPENUM (Resource_GlobalNet, ResourceType_Disk,
Resourceusage_container, @ netResource, lphenum;
If res <> no_error dam; // execution failed
While true do // lists information about all working groups of a network type
Begin
Count: = $ fffffff; // Number of unlimited resources
BUFSIZE: = 8192; // Buffer size Set to 8K
GetMem (buf, bufsize); // Apply for memory to obtain workgroup information
// Get a file resource information of a network type,
Res: = WneetenumResource (Lphenum, Count, Pointer (BUF), BUFSIZE
IF (res = error_no_more_items) // resource list
or (res <> no_error) // Execution failed
Then Break;
P: = TNetResourceArray (BUF);
For i: = 0 to count - 1 do // list information from each working group
Begin
List.add (StrPas (p ^ .lpremotename); // get the name of a workgroup
INC (P);
END;
END;
Res: = WnetCloseenum (lphenum); // Close a list
If res <> no_error dam; // execution failed
END;
RESULT: = TRUE
FreeMem (buf);
NetWorktyPelist.destroy;
Second, list the computer name in a working group
In the WNETOpenenum function, specify the LPREMOTENAME section in the parameter lpnetResource as a name (such as "MyWorkGroup"), you can get a handle, using this handle in WneetenumResource, you can get a NetResource type array, each NetResource element The LPREMOTENAME section is a computer name (such as "// wangfajun").
Please refer to the following blocks and comment information.
NetResource.lpremotename: = @Groupname [1]; // Specify the name of the workgroup
NetResource.dwdisplayType: = ResourceDisplayType_server; // Display type is server (working group)
NetResource.dwusage: = Resourceusage_Container;
NetResource.dwscope: = resourcetype_disk; // list file resource information
/ / Get the network resource handle of the specified workgroup
Res: = WNETOPENUM (Resource_GlobalNet, ResourceType_Disk,
Resourceusage_container, @ netResource, lphenum;
Get the full program source code for the computer name as follows:
/ / Lists the computer name in the specified Workgroup GroupName, and the return value indicates that the execution is successful, // Parameter list Return to the computer name Function GetUsers (Groupname: string; var list: tstringlist): boolean; var
NetResource: TNETRESOURCE;
BUF: POINTER;
Count, BufSize, Res: DWORD
Ind: inteer;
Lphenum: thandle;
Temp: TNetResourceArray; Begin
Result: = FALSE;
List.clear;
Fillchar (NetResource, Sizeof (NetResource), 0); // Initialization Network Hierarchy Information
NetResource.lpremotename: = @Groupname [1]; // Specify the name of the workgroup
NetResource.dwdisplayType: = ResourceDisplayType_server; // Type Server (Workgroup)
NetResource.dwusage: = Resourceusage_Container;
NetResource.dwscope: = resourcetype_disk; // list file resource information
/ / Get the network resource handle of the specified workgroup
Res: = WNETOPENUM (Resource_GlobalNet, ResourceType_Disk,
Resourceusage_container, @ netResource, lphenum;
If res <> no_error thr; // execution failed
While true do // lists the network resources of the designated workgroup
Begin
Count: = $ fffffff; // Number of unlimited resources
BUFSIZE: = 8192; // Buffer size Set to 8K
GetMem (buf, bufsize); // Apply for memory to obtain workgroup information
// Get the computer name
Res: = WneetenumResource (Lphenum, Count, Pointer (BUF), BUFSIZE
If res = error_no_more_items the Break; // Resource list
IF (res <> no_error) THEN EXIT; / / Execution Failure
Temp: = TNetResourceArray (BUF);
For ind: = 0 to count - 1 do // List the computer name of the working group
Begin
/ / Get the computer name of the working group, 2 means delete "//", such as // wangfajun => wangfajun
List.add (temp ^ .lpremotename 2);
Inc (TEMP);
END;
END;
Res: = WnetCloseenum (lphenum); // Close a list
If res <> no_error thr; // execution failed
RESULT: = TRUE
FreeMem (buf);
Third, list sharing resources in a computer
In the WNEToPENENUM function, specify the LPREMOTENAME section in the parameter LpNetResource as a computer name (such as "// wangfajun"), you can get a handle, using this handle in WneetenumResource, you can get a NetResource type array, each NetResource The element's LPREMOTENAME section is a shared resource name in the computer (which can be shared directory and file name, shared printer name, etc., such as "// wangfajun / shared file").
Please refer to the following blocks and comment information.
NetResource.lpremotename: = @username [1]; // Specify the computer name
/ / Get the network resource handle of the specified computer
Res: = WNETOPENENUM (Resource_GlobalNet, ResourceType_any,
Resourceusage_Connectable, @ NetResource, Lphenum;
Get the full program source code for the computer name as follows:
/ / Lists the shared resource name in the specified computer username, and the return value indicates that the execution is successful, // Parameter list Returns Function GetUserResource (username: string; var list: tstringlist): boolean; var
NetResource: TNETRESOURCE;
BUF: POINTER;
Count, BufSize, Res: DWORD
Ind: inteer;
Lphenum: thandle;
Temp: TNetResourceArray; Begin
Result: = FALSE;
List.clear;
Fillchar (NetResource, Sizeof (NetResource), 0); // Initialization Network Hierarchy Information
NetResource.lpremotename: = @username [1]; // Specify the computer name
/ / Get the network resource handle of the specified computer
Res: = WNETOPENENUM (Resource_GlobalNet, ResourceType_any,
Resourceusage_connectable, @ netResource, lphenum); if res <> no_ERROR THEN EXIT; / / Execution failed
While true do // lists the network resources of the designated workgroup
Begin
Count: = $ fffffff; // Number of unlimited resources
BUFSIZE: = 8192; // Buffer size Set to 8K
GetMem (buf, bufsize); // Apply for memory to obtain workgroup information
/ / Get the network resource name of the specified computer
Res: = WneetenumResource (Lphenum, Count, Pointer (BUF), BUFSIZE
If res = error_no_more_items the Break; // Resource list
IF (res <> no_error) THEN EXIT; / / Execution Failure
Temp: = TNetResourceArray (BUF);
For ind: = 0 to count - 1 DO
Begin
/ / Get the name of the shared resource in the specified computer, 2 means delete "//",
// 如 // wangfajun => WANGFAJUN
List.add (temp ^ .lpremotename 2);
Inc (TEMP);
END;
END;
Res: = WnetCloseenum (lphenum); // Close a list
If res <> no_error thr; // execution failed
RESULT: = TRUE;
FreeMem (buf);
The above program is debugged under PWIN98 Delphi3.0.