说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

在DELPHI程序中获取网络资源信息

HTML文档下载 WORD文档下载 PDF文档下载
在DELPHI程序中获取网络资源信息

充分利用局域网中的共享资源,无疑将减少用户的硬件和软件投资。在我们的程序中,常常会需要列举局域网络中的共享资源,如在MIDAS多层应用程序中可能要选择上层应用程序所在的服务器的名称、在打印模块中选择可用的网络打印机、在应用程序中选择其它机器上的共享文件等。

以一个MIDAS三层数据库应用程序为例子,我们可以用DELPHI制作一个客户端应用程序和一个中间层业务处理程序,由中间层业务处理程序向数据库存取数据,再将结果反馈到客户端。

当客户端应用程序与中间层程序和数据库服务程序不在一台机器上时,需要指定中间层程序和数据库服务程序所在的服务器的名称。

在DELPHI程序中,我们可以通过WIN API来列举局域网络中的服务器名称、用户计算机名称、用户共享目录和文件、共享打印机等资源,这些API由文件MPR.DLL提供。

下面以WIN9X的对等网络为例子,列举“网络邻居”中的工作组名称、用户计算机名称、共享目录和文件、共享打印机等资源。

一、列举“网络邻居”中的工作组名称

在“网络邻居”中,打开“整个网络”,可以看到网络中的所有工作组的名称。在DELPHI程序中,可以用API函数WNetOpenEnum和WNetEnumResource来列举“网络邻居”中的工作组名称。

下面是两个API函数的简介,具体请参见DELPHI帮助文件。

//WNetOpenEnum用于获取一个网络资源句柄,作为WNetEnumResource列举网络资源的依据,其函数原型如下:

function WNetOpenEnum(

dwScope

//网络范围

RESOURCE_CONNECTED(已连接机器)

RESOURCE_GLOBALNET(所有机器)

RESOURCE_REMEMBERED(已记忆的机器)

dwType

//资源类型

RESOURCETYPE_ANY(所有资源)

RESOURCETYPE_DISK(文件资源)

RESOURCETYPE_PRINT(打印资源)

dwUsage//资源用途

0(所有资源)

RESOURCEUSAGE_CONNECTABLE(所有可连接资源)

RESOURCEUSAGE_CONTAINER(所有container资源)仅在dwScope为RESOURCE_GLOBALNET是有效

: DWORD;

lpNetResource: PNetResource;//NetResource类型指针,其内存表示网络资源的层次

为NIL时

表示最上层,仅在dwScope为RESOURCE_GLOBALNET时有效

其它情况时应为NIL

var lphEnum: THandle//返回网络资源句柄,是WNetEnumResource进一步列举网络资源的依据

): DWORD; stdcall;

返回值NO_ERROR表示执行成功,否则应用GetLastError获取错误信息

//WNetEnumResource用于列出当前网络中可用的资源,包括文件资源和打印资源,其函数原型如下:

function WNetEnumResource(

hEnum: THandle;//WNetEnumResource进一步列举网络资源的依据

通常由WNetOpenEnum取得

var lpcCount: DWORD;//要取得资源的数目,$FFFFFFFF表示列出所有资源,返回值为实际资源数目

lpBuffer: Pointer;//接收结果的缓冲区的指针,一般是NetResource类型的数组

var lpBufferSize: DWORD//接收结果的缓冲区大小(Byte)

): DWORD; stdcall;

返回值为NO_ERROR(执行成功)或ERROR_NO_MORE_ITEMS(资源列举完毕),否则应用GetLastError获取错误信息。

要列举网络中的工作组信息,首先要获取网络中的网络类型,再获取每一种类型网络中包含的工作组的名称。

1、获取网络类型信息

局域网中可以是由多种类型的网络组成,如由Microsoft、Novell等类型的网络组成。用API函数WNetOpenEnum和WNetEnumResource可以获取网络类型信息。

(1)用WNetOpenEnum函数返回一个句柄,作为WNetEnumResource列举网络资源的依据。我们的目标是列举“整个网络”的工作组名称,因而网络范围为RESOURCE_GLOBALNET(所有机器)、资源类型为RESOURCETYPE_DISK(文件资源)、资源用途为RESOURCEUSAGE_CONTAINER(所有container资源)、

网络层次为最高层(NIL),这样可以得到一个句柄,以便进一步列举网络资源。具体的程序段如下:

{ Res : DWORD; lphEnum : THandle; }

Res := WNetOpenEnum( RESOURCE_GLOBALNET

RESOURCETYPE_DISK

RESOURCEUSAGE_CONTAINER

Nil

lphEnum);

If Res <> NO_ERROR Then exit;//执行失败

(2)用API函数WNetEnumResource可以获取网络类型信息,此时要用到上面获取的句柄lphEnum,

可以获取一个NetResource类型的数组,每个NetResource元素即为一种网络类型信息。

具体的请参见以下程序段及注释信息。

type

TNetResourceArray = ^TNetResource;//网络类型的数组

Var

NetResource : TNetResource;

Buf : Pointer;

Count

BufSize

Res : DWORD;

lphEnum : THandle;

p : TNetResourceArray;

i

j : SmallInt;

NetworkTypeList : TList;

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 Exit;

P := TNetResourceArray(Buf);

For I := 0 To Count - 1 Do//记录各个网络类型的信息

Begin

NetworkTypeList.Add(p);

Inc(P);

End;

......

end;

2、获取工作组信息

在获取网络类型信息后,可以根据此信息获取此类型网络中的服务器(工作组)信息。

在WNetOpenEnum函数中,将参数lpNetResource指定为一种网络类型信息,可以获取一个句柄,在WNetEnumResource中利用这个句柄,可以获取一个NetResource类型的数组,每个NetResource元素的lpRemoteName部分即为一个工作组名称(如“MyWorkGroup”)。

具体的请参见以下程序段及注释信息。

//列出一个网络类型中的所有工作组名称

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;

3、获取工作组信息的完全源代码

//列举出整个网络中的工作组名称,返回值为TRUE表示执行成功,

//参数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;

//获取整个网络中的文件资源的句柄,lphEnum为返回名柄

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);//申请内存,用于获取工作组信息

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;

二、列举一个工作组中的计算机名称

在WNetOpenEnum函数中,将参数lpNetResource中的lpRemoteName部分指定为一个工作组的名称(如“MyWorkGroup”),可以获取一个句柄,在WNetEnumResource中利用这个句柄,可以获取一个NetResource类型的数组,每个NetResource元素的lpRemoteName部分即为一个计算机名称(如

“\\wangfajun”)。

具体的请参见以下程序段及注释信息。

NetResource.lpRemoteName := @GroupName[1];//指定工作组名称

NetResource.dwDisplayType := RESOURCEDISPLAYTYPE_SERVER;//显示类型为服务器(工作组)

NetResource.dwUsage := RESOURCEUSAGE_CONTAINER;

NetResource.dwScope := RESOURCETYPE_DISK;//列举文件资源信息

//获取指定工作组的网络资源句柄

Res := WNetOpenEnum( RESOURCE_GLOBALNET

RESOURCETYPE_DISK

RESOURCEUSAGE_CONTAINER

@NetResource

lphEnum);

获取计算机名称的完全程序源代码如下:

//列举出指定工作组GroupName中的计算机名称,返回值为TRUE表示执行成功,

//参数List中返回计算机名称

Function GetUsers( GroupName : string; var List : TStringList ) : Boolean;

Var

NetResource : TNetResource;

Buf : Pointer;

Count

BufSize

Res : DWord;

Ind : Integer;

lphEnum : THandle;

Temp : TNetResourceArray;

Begin

Result := False;

List.Clear;

FillChar(NetResource

SizeOf(NetResource)

0);//初始化网络层次信息

NetResource.lpRemoteName := @GroupName[1];//指定工作组名称

NetResource.dwDisplayType := RESOURCEDISPLAYTYPE_SERVER;//类型为服务器(工作组)

NetResource.dwUsage := RESOURCEUSAGE_CONTAINER;

NetResource.dwScope := RESOURCETYPE_DISK;//列举文件资源信息

//获取指定工作组的网络资源句柄

Res := WNetOpenEnum( RESOURCE_GLOBALNET

RESOURCETYPE_DISK

RESOURCEUSAGE_CONTAINER

@NetResource

lphEnum);

If Res <> NO_ERROR Then Exit; //执行失败

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 Then break;//资源列举完毕

If (Res <> NO_ERROR) then Exit;//执行失败

Temp := TNetResourceArray(Buf);

For Ind := 0 to Count - 1 do//列举工作组的计算机名称

Begin

//获取工作组的计算机名称,+2表示删除"\\",如\\wangfajun=>wangfajun

List.Add(Temp^.lpRemoteName + 2);

Inc(Temp);

End;

End;

Res := WNetCloseEnum(lphEnum);//关闭一次列举

If Res <> NO_ERROR Then exit;//执行失败

Result := True;

FreeMem(Buf);

End;

三、列举一个计算机中的共享资源

在WNetOpenEnum函数中,将参数lpNetResource中的lpRemoteName部分指定为一个计算机的名称(如“\\wangfajun”),可以获取一个句柄,在WNetEnumResource中利用这个句柄,可以获取一个NetResource类型的数组,每个NetResource元素的lpRemoteName部分即为计算机中的共享资源名称(可以是共享目录和文件名称、共享打印机名称等,如“\\wangfajun\共享文件”)。

具体的请参见以下程序段及注释信息。

NetResource.lpRemoteName := @UserName[1];//指定计算机名称

//获取指定计算机的网络资源句柄

Res := WNetOpenEnum( RESOURCE_GLOBALNET

RESOURCETYPE_ANY

RESOURCEUSAGE_CONNECTABLE

@NetResource

lphEnum);

获取计算机名称的完全程序源代码如下:

//列举出指定计算机UserName中的共享资源名称,返回值为TRUE表示执行成功,

//参数List中返回共享资源名称

Function GetUserResource( UserName : string ; var List : TStringList ) : Boolean;

Var

NetResource : TNetResource;

Buf : Pointer;

Count

BufSize

Res : DWord;

Ind : Integer;

lphEnum : THandle;

Temp : TNetResourceArray;

Begin

Result := False;

List.Clear;

FillChar(NetResource

SizeOf(NetResource)

0);//初始化网络层次信息

NetResource.lpRemoteName := @UserName[1];//指定计算机名称

//获取指定计算机的网络资源句柄

Res := WNetOpenEnum( RESOURCE_GLOBALNET

RESOURCETYPE_ANY

RESOURCEUSAGE_CONNECTABLE

@NetResource

lphEnum);

If Res <> NO_ERROR Then exit;//执行失败

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 Then break;//资源列举完毕

If (Res <> NO_ERROR) then Exit;//执行失败

Temp := TNetResourceArray(Buf);

For Ind := 0 to Count - 1 do

Begin

//获取指定计算机中的共享资源名称,+2表示删除"\\",

//如\\wangfajun=>wangfajun

List.Add(Temp^.lpRemoteName + 2);

Inc(Temp);

End;

End;

Res := WNetCloseEnum(lphEnum);//关闭一次列举

If Res <> NO_ERROR Then exit;//执行失败

Result := True;

FreeMem(Buf);

End;

程序员,如何在工作中崭露头角? 国内外三个不同领域巨头分享的Redis实战经验及使用场景 这是一场潜在的战争:谷歌与Facebook、苹果在搜索上的博弈 设计新闻类网站需要注意的关键点:移动友好、宽带…… 直接开始用:5个免费的在线思维组织工具 招聘开发者常见的九大误区 开源影响销售,维护赞助商? 盘点黑客攻击途径:最常用的7个策略及简单的防护方法 专访AngularJS框架创始人Misko Hevery:让Web开发更便捷 果粉的又一个节日:新iPad或于10月22日发布 新车间李大维:到集装箱里来看创客嘉年华 亚马逊推“登录与支付”功能 直接冲击PayPal Google编程之夏新里程碑:5000万行源代码 8500名学生开发者 非常实用的15款开源PHP类库 Runnable:一站式代码片段服务平台,打造编程界的YouTube 谷歌向所有开发者开放Google App Engine PHP Runtime “沟通”电子表格和矢量图形的“桥梁”:在线可视化工具Raw Facebook北极圈数据中心,Open Compute Project的力作! 最后三天!4折抢购2013移动开发者大会门票 电子书追踪统计,App Annie for eBooks上线 先驱还是模仿者?细数海外移动应用推广平台 IDC:PC出货量下滑终于放缓 联想销量再次第一 为什么说,用一块屏幕玩游戏是远远不够的? 编写代码?先熟悉一下编程语言界限吧! Spanner vs. F1:谷歌两大数据管理利器的整体对比及关联 移动设计需摒弃的几大PC应用设计方法 响应式导航设计案例解析(多图) 所见即所得:七大无需编程的DIY开发工具 前Google员工发布无痕搜索产品,阻老东家财路 VMware推出vCloud Suite及vSphere新版:可用性及性能双丰收 TIOBE 2013年10月编程语言排行榜:Groovy首次挤进Top 20 有关在button中增加图片的简单问题,在线等待 高分求codeWizard和C++Test的license SQL中,INT型是不是只能有4位数?我作的记录点击数反正不能突破一万,要将INT型改为什么型? url傳遞參數變量及Form表單提交問題? 人民币购买房产测绘代码 关于sql的身份验证问题? PC和PS/2鼠标如何通讯? 那位大虾有小写金额转换为英文大写金额的程序? 各位大俠幫幫忙,請問如何將金額的數值轉換為英文的大寫,急線上等待! 如果给定一个表名,怎样知道数据库中这张表存在与否? 双喜临门,激动不已啊... 不能在sql语句中调用字符串处理函数,怎么办? 在WAS4.0 AE控制中,启动应用程序服务器的时候,没有装入相应的 Web 模块,为什么? url傳遞參數變量及Form表單提交問題? 关于声音频率 有关数据库的问题,请不吝赐教 怎样将16进制的转成Unicode? 我的XP不能被局域网内其他用户访问 只提一条记录的问题!! 为什么我的ServletContext会出错呢? 上传看不到主页啊???web.config vb+asp.net 很急,在线等待 網頁url傳遞參數變量及Form表單提交問題? 50分! 又是字符串,怎么总与我过不去 怎样把文件写入服务器端中映射的驱动器中,急 在线等。。。 [我贴我灌]世锦赛罗雪娟夺第三金 关于用户离职和升级后的处理? 代码问题,高手进 急,在线等待 DNS服务器的问题,高手救命!!!问题解决不了,老板要我走人了!!!!!(痛哭中 &&&&&&&&&) 鼠标当前位置的值与窗体位置如me.left 的值是怎么样换算的? 英文OS,我加一个中文字库,我要在我的程序中显示中文,该做些什么? 一个硬件问题,来看看吧!问了好多人多不明白 bcb6自带的install??? 简单要求 CSDN出的《JBuilder实用技术手册》到底怎么样呀?我看目录怎么像垃圾? 在jsp怎么取得用javabean连接得数据库中得记录总数 请教各位大师,如何用VB做一个象ComboBox一样的控件 web Service里的Application的问题 有没有能够打印固定行数的报表? 对XML不太熟悉,麻烦大家再看看! 关于bho及控制ie行为的问题, 如何动态的设置datawindow的计算域的表达式,及从程序中如何得到该计算域的值 [我贴我灌]巴塞罗那凯旋归来 “花样姑娘”泪洒观澜湖 一个到现在还没有解决的问题!我着急用啊!请哪位高手帮忙解决了,有高分相送! WIN32 CONSOLE APPLICATION 中怎么调用DLL (动态连接库) 怎么增加不了行,插入不了了?请大虾给个提示 50美元求作业! 如果没有学过C语言,能不能学J2SE啊? 100分请教:一个串行接口通信的问题————在线等待?!!!! 从骆驼身上能学到什么? 从一种群中随机抽出一定数量个体,其中基因型AA的个体占24%,Aa占72%,aa占4%.请问基因A和a的频率分别是 为什么将电导度的测量和糖的显色反应一并进行测定? 1、植物体内自由基是如何产生的?有哪些种类?(简答)2、植物体内清除自由基的机制有哪些?(简答)3、影响本实验(超氧化物歧化酶活性测定)准确性的主要因素是什么?应该如何克服? 我们要考植物生理了,有个题是叶片变黄的原因.谁有准确的答案啊 心脏的四个腔分别和什么相连? 数显千分尺的SPC信号是怎么回事? 为什么题目中提到缓慢移动等词时,就是平衡状态? 平衡移动的条件 数显千分表的SPC信号是怎么回事? 十二生肖分别和骆驼身上哪些地方相似 聚焦全球健康服务业 看产业带来的经济中断30年 美国与新西兰恢复联合军演格鲁吉亚新当选总统:将与俄构筑建设性迈克尔杰克逊私人医生刑满出狱 欲再获英国遭近年最大暴风雨袭击 交通受阻数翘臀又嘟嘴 壮汉翻拍“性感照”遭吐槽婚外情网站进军狮城遇阻西飞成波音737MAX供应商迈克尔杰克逊私人医生刑满出狱 欲再获日报:朝鲜增设14个经济特区 允许土十八届三中全会或定调国企改革:国民共卡西利亚斯:观众至高无上,我应该适应邓向阳赴金寨调研:着力加强农村基层组出口花卉欧盟推迟与乌自贸协定实施日期巴准军事部队车辆遇袭致3人死亡美第二大报业集团寻买家习近平同塔吉克斯坦总统拉赫蒙会谈重庆一景区为“低头族”设“手机人行道野生中华鲟首次未自然繁殖面临灭绝风险台制售“馊水油”企业董事长遭羁押北爱前领导人佩斯利去世
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘