充分利用局域网中的共享资源,无疑将减少用户的硬件和软件投资。在我们的程序中,常常会需要列举局域网络中的共享资源,如在MIDAS多层应用程序中可能要选择上层应用程序所在的服务器的名称、在打印模块中选择可用的网络打印机、在应用程序中选择其它机器上的共享文件等。 Uw3wR!:
C?<-`$0
<KoOJMx(
[W3sveqj&
以一个MIDAS三层数据库应用程序为例子,我们可以用DELPHI制作一个客户端应用程序和一个中间层业务处理程序,由中间层业务处理程序向数据库存取数据,再将结果反馈到客户端。当客户端应用程序与中间层程序和数据库服务程序不在一台机器上时,需要指定中间层程序和数据库服务程序所在的服务器的名称。 e$rPXRf
T+%P+
#)S&Z><<
7lwFxP5QT
在DELPHI程序中,我们可以通过WIN API来列举局域网络中的服务器名称、用户计算机名称、用户共享目录和文件、共享打印机等资源,这些API由文件MPR.DLL提供。 ) <w`:wD
U5?QneK
&W `7 b<
]z#Ita;
下面以WIN9X的对等网络为例子,列举“网络邻居”中的工作组名称、用户计算机名称、共享目录和文件、共享打印机等资源。 hC]:+.Q+
;!3: 3;
P1$D[aF9$
dAM]ZR<
一、列举“网络邻居”中的工作组名称 (FGHt/!
V<ilv<
S5UQ
GE !p
在“网络邻居”中,打开“整个网络”,可以看到网络中的所有工作组的名称。在DELPHI程序中,可以用API函数WNetOpenEnum和WNetEnumResource来列举“网络邻居”中的工作组名称。 W}%[i+
6%wlz%Fp
C!6D /S
|=:hUp Jp
下面是两个API函数的简介,具体请参见DELPHI帮助文件。 r;wm`(e
l%2 gM7WMY
n5tsaU;
(W[]}k;
//WNetOpenEnum用于获取一个网络资源句柄,作为WNetEnumResource列举网络资源的依据,其函数原型如下: z;N`jqo
# |OA>[
s<3M_mt
q; C6ID`
function WNetOpenEnum( OF-g7s6VH
S&J5QZjC
\
*g3j
3Lv5>[MnN
dwScope,//网络范围,RESOURCE_CONNECTED(已连接机器),RESOURCE_GLOBALNET(所有机器), J*Cf1 D5!
H"?Ndl:
IaO&f<^#o
~K(mt0T)
RESOURCE_REMEMBERED(已记忆的机器) 2j]uB0
$Ny: At
WfTl\Dxw
`9\^.g)
dwType,//资源类型,RESOURCETYPE_ANY(所有资源),RESOURCETYPE_DISK(文件资源), Z4gn7
'V
*|;`Gp
0c,!<\B
K\mFb
RESOURCETYPE_PRINT(打印资源) y!q`o$nK
b+$wx~PLi
f*p=j(sF
,;<M+V3+
dwUsage//资源用途,0(所有资源),RESOURCEUSAGE_CONNECTABLE(所有可连接资源), PO:sF]5
$gL^\(_3H
w`dSc@ :
HLc3KYIk
RESOURCEUSAGE_CONTAINER(所有container资源)仅在dwScope为RESOURCE_GLOBALNET是有效: DWORD; <$K7f
f=8{cK0j
4VC8#x1
q_"w,28
lpNetResource: PNetResource;//NetResource类型指针,其内存表示网络资源的层次,为NIL时 Ie s` !W^
\}YAQ'T
m5,&;~
\H1t<B,
表示最上层,仅在dwScope为RESOURCE_GLOBALNET时有效,其它情况时应为NIL Tiimb[|
#GUD^#Jh
4sC)hAx&f
wb##|XyK<c
var lphEnum: THandle//返回网络资源句柄,是WNetEnumResource进一步列举网络资源的依据 nAX/u[
GBT219Z@8
Wy /5Qw~s
(io[O?te
): DWORD; stdcall;返回值NO_ERROR表示执行成功,否则应用GetLastError获取错误信息 10N0?K"
O&VA79\UO
,H$%'s1I(
,&Vir)S
//WNetEnumResource用于列出当前网络中可用的资源,包括文件资源和打印资源,其函数原型如下: 7d+0'3%
/1Ss |.
v0T?c53?
cu)B!#<!&
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获取错误信息。 us.IdG
O.-A)S@
kX)*:~*
0+.<BOcW5
Xc~BHEp
5Y@Hb!5D
O]@s`w
IfY?P(P
要列举网络中的工作组信息,首先要获取网络中的网络类型,再获取每一种类型网络中包含的工作组的名称。 SN[ar&I
P5GV9SA
Rh)%;
`f<w+u
1、获取网络类型信息 `L!L=.}4
:z%Zur+n c
9`KFJx6D
b S' dXP
局域网中可以是由多种类型的网络组成,如由Microsoft、Novell等类型的网络组成。用API $0+&xJVn
Mf7
[@#$
b+L !p.:
j'lC]}kH
函数WNetOpenEnum和WNetEnumResource可以获取网络类型信息。 BbPRPkV
[e{D
JEP9!y9y
en6;I[\
(1)用WNetOpenEnum函数返回一个句柄,作为WNetEnumResource列举网络资源的依据。我们的目 :Smyk.B2!
Q9;VSF)
aNwx~t]G
UXwI?2L
标是列举“整个网络”的工作组名称,因而网络范围为RESOURCE_GLOBALNET(所有机器)、资源类 @3~Wukc
+G,_|C2J
_@g\.7@0G
X0]$Ovq( l
型为RESOURCETYPE_DISK(文件资源)、资源用途为RESOURCEUSAGE_CONTAINER(所有container资源)、 ]K%d
Oh,Xjel
#5iwDAw:|r
$Yw~v36`t/
网络层次为最高层(NIL),这样可以得到一个句柄,以便进一步列举网络资源。具体的程序段如下: !Fs<r)j
,8cVv->u/
Y@ vC!C
aN!,\D
{ Res : DWORD; lphEnum : THandle; } ,kl``w|1M
*)vy%\
vJsg6oH
7$8DMBqq
Res := WNetOpenEnum( RESOURCE_GLOBALNET, RESOURCETYPE_DISK, -M4VC^_
IIF <Zkpb
pOj8-rr
rX)_!mR
RESOURCEUSAGE_CONTAINER, Nil,lphEnum); ]u:Ij|.'y0
kxmsrQ>av
tJGK9!MH{(
6}Rb-\N
If Res NO_ERROR Then exit;//执行失败 h${=gSJc
_SH~.Mt_!
^g.HJQ'vF
[@]i_L[
(2)用API函数WNetEnumResource可以获取网络类型信息,此时要用到上面获取的句柄lphEnum, L=WKqRa>4
1@F>E;YjL=
X?(R!=a
"I @akM$x
可以获取一个NetResource类型的数组,每个NetResource元素即为一种网络类型信息。 -KZ9TV # R
u(PUbxJ
V
xlh<}Vtp
K~fWZT3]
具体的请参见以下程序段及注释信息。 l% qh^0
by$mD_sr
rqKK89fD'
M-e|$'4u
type Z4m+GFY
Cm0K-~
U
FV/lBWiQQ
_<l)4A3rS
TNetResourceArray = ^TNetResource;//网络类型的数组 0C6T>E7
7y$U$6
Var 3 FMYs&0r4
Qtt3;5m
|D[LU[<C
Or55_E
NetResource : TNetResource; zy|h1.gd
c_aj-`BKp
Pjq()\/[Z
UMHFq-
Buf : Pointer; b=SCyGxlZ5
q2;CvoF
.k%/JF91n
98vn"=3
Count,BufSize,Res : DWORD; o)'06FF\$
D4?cnwU
JM53sx4&
<L2z| %`
lphEnum : THandle; =dp`4N
R'oGsaPB2
hdqr~9
$8Z4jo
p : TNetResourceArray; =%B}8$.|
at\$
IK_
urQ<r{$x0
zXkq2\GHA
i,j : SmallInt; &egP3
<X?xr f
rmdg~
fVi[mH0=+
NetworkTypeList : TList;begin MOm+t]vq1
z9v70
q
vOl3utu7
2Tv
W 6
...... $F]*B
`
g'EPdE
di<g"8
+;bZ(_ohG
Count := $FFFFFFFF;//不限资源数目 %H3iX^}*
Dw,LB>Eq,
Ty*+?#`
a;&0u>
BufSize := 8192;//缓冲区大小设置为8K }|RL6p-/'
q77Iq0VR
Pu'lp
O
6H0aHCM
GetMem(Buf, BufSize);//申请内存,用于获取工作组信息 V8Z@y&ny
ZbH_h]1$D
j_b/66JyN
(Sj<>xgd
Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);//获取网络类型信息 l>("L9
-.-@|*5
4z^~,7J^
5H(
]"C
If ( Res = ERROR_NO_MORE_ITEMS )//资源列举完毕 w*u.z(:a`
iL~(BnsF
<1`MjP*w
OfeM;)
or (Res NO_ERROR )//执行失败 INR RA
},O7NSG<o
8L`wib2
YI]/gWeu
Then Exit; X3y28 %R
!"ydl2
@}'?o_/C
@k/|%%uP
P := TNetResourceArray(Buf); ]puDqu5!
LwH+X:?i
t{Ks}9B
f+Fzpd?w S
For I := 0 To Count - 1 Do//记录各个网络类型的信息 d~T@fa
<<9|*Tz
)[=C@U
{l\Ep=O vx
Begin -:Q"aeC5
N_(-\\mq
VuH}@
tn |H~iF{
NetworkTypeList.Add(p); }t1 q5@QU
D<[kbt5^7
2N.!#~_2 D
V0_^==Vs
Inc(P); d^"|ESQEU
drp< f1`l8
Tq8U5#NF
uTy00`1
End; C @P$RVS
MI`<U:-lP
Ze?H
}xgs]\^,73
......end; dX-j3lM:#
FQ/z,it_i
i{r[zA]$
Z,>owoP4
2、获取工作组信息 (T.j3@Ko
ixqvX4vv,B
|WgFLF~k
a24(9(yh
在获取网络类型信息后,可以根据此信息获取此类型网络中的服务器(工作组)信息。 +;q`A1
/KlSI<T@
)1<GSr9
oF s)UR
在WNetOpenEnum函数中,将参数lpNetResource指定为一种网络类型信息,可以获取一个句柄,在WNetEnumResource中利用这个句柄,可以获取一个NetResource类型的数组,每个NetResource元素的lpRemoteName部分即为一个工作组名称(如“MyWorkGroup”)。 6hHMxS^o
^vI`#}?
w=~X 6[+3
/5Yl, P
具体的请参见以下程序段及注释信息。 5K=>x<
#zc$cr
]hbrzvo
&b]_#c
//列出一个网络类型中的所有工作组名称 j(c;r>
)t,efg
`mquGk|)
tHFUV\D;,
NetResource := TNetResource(NetworkTypeList.Items[J]^);//网络类型信息//获取某个网络类型的文件资源的句柄,NetResource为网络类型信息,lphEnum为返回句柄 EIOP+9zP
C`8.8
jTqEV(
) LohB,?
Res := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_DISK, (7X^z&2
j<h0`v
1.nYT*
R!>SN0
RESOURCEUSAGE_CONTAINER, @NetResource,lphEnum); d\tA1&k71
EEHTlqvR
$;)A:*e
rt\.|Hr4s
If Res NO_ERROR Then break;//执行失败 M2A_T.F=H
sDkO!P
TR:4$92:H
WKq{g+a
While true Do//列举一个网络类型的所有工作组的信息 ^KQZ;[B
:=K+~?
gbu)bqu2x
mqiCn]8G
Begin ~;oaW<"
e`?o`@vO,
= @ 1{LF;
|
Count := $FFFFFFFF;//不限资源数目 )OFf nKh
fD2 N}
Na+3aM%%
I8\R7s3
BufSize := 8192;//缓冲区大小设置为8K ZD4:'m`T/
sTxbh2
mwF{z.t"
!"
@<!
GetMem(Buf, BufSize);//申请内存,用于获取工作组信息 S]gV! Q4%
<
WQ
~X<1D
?p>m;Aq
"l B%"}
//获取一个网络类型的文件资源信息, uFfk!
N \woFrG
I@(3~ Ab
*~zB {
Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize); $/Llzpvny
w[u>*I
5#dJga/88
)1!0'j99.
If ( Res = ERROR_NO_MORE_ITEMS ) //资源列举完毕 +O7GgySx
n -xCaq
_DYe<f.
V" KuwM
or (Res NO_ERROR) //执行失败 PD-*rG `
~b6c:db3
t* =i8`8
L^Fb;sJYI
then break; Gf-GDy\{
H2yPVJ\Y)"
4UMOC_
XM`&/)
P := TNetResourceArray(Buf); B3E}fQm )
GGsAisF"N
MKX58y{+
4G j
For I := 0 To Count - 1 Do//列举各个工作组的信息 Fh}GJE
!_-Uwg
QvlVjDIy
yL23Nqe
Begin j/1f|x
Z5@E|O &
mJsU7bD`
12l1u[TlS
List.Add( StrPAS( P^.lpRemoteName ));//取得一个工作组的名称 !HF<fn
@u:q#b
~bgM*4GW
6|1*gl1_LD
Inc(P); 4p>,
-v9x tNg
H?;@r1ZAn
u0%bv\$m
End; 9T<k|b[6
"71Y{WQ
EnEaUb?P
RP9~n)h~b
End; *`t3z-L
)qRE['M
!z]{zM%
UryHte
3、获取工作组信息的完全源代码//列举出整个网络中的工作组名称,返回值为TRUE表示执行成功, f;bVzti+w
`_OB_F
4XSq\.@G
eRg;)[#0>$
//参数List中返回服务器(工作组)的名称
>j&k:
Mz;KXP
Function GetServerList( var List : TStringList ) : Boolean; *~d<]U5h
m>!aI?g
Var b:$q5
UGP&&A#T-
it->)?"(6
]G,BSttD
NetResource : TNetResource; oz l>Au
K"Gea`I
a#&\65D
$v=(`=
Buf : Pointer; Ib"fHLWA^!
Cjj(v7[E
A%~t[ H
"P$')uwE
Count,BufSize,Res : DWORD;
va!fJ
fH%C&xj'&
,W>-MPJn[8
G~/*!?&z
lphEnum : THandle; 1{G@'#(
k.\4<}
4Td)1~zc3
)#,a'~w
p : TNetResourceArray; h3Nbgxa.
-$`q:j
fdgjTX
BipD8`a
i,j : SmallInt; eH%i8a
y_T%xWK5
h@Ix9!?+
jgBJs^JgYG
NetworkTypeList : TList; n%6=w9.%c
X|y0pH:S
Begin _$KkSMA~_
;.7]zn.X]2
DO~~
@Suww@<
Result := False; kWgrsN+Z
(mx}6A
F /"lJ/I
2]H?q!l!O
NetworkTypeList := TList.Create;
hAD gi^
%4w#EbkSS
`8;\}6:"1
Ee=!bv(%70
List.Clear;//获取整个网络中的文件资源的句柄,lphEnum为返回名柄 iGNZC{
1:4u]$@E
E/_n}$Z
8*eVP*g
Res := WNetOpenEnum( RESOURCE_GLOBALNET, RESOURCETYPE_DISK, +>:[irf
(lvp-<*
_SQ]\Z
$Y%,?>AL<
RESOURCEUSAGE_CONTAINER, Nil,lphEnum); .xtam 8@
;>Z0e`=
2 y&k
f5'vjWJ30
If Res NO_ERROR Then exit;//Raise Exception(Res);//执行失败//获取整个网络中的网络类型信息 :* J!
+<WNAmh
rC6EgWt<V
wLo<gA6;
Count := $FFFFFFFF;//不限资源数目 IC-W[~
BuS[(
@y,>cDg
#W/ATsDt
BufSize := 8192;//缓冲区大小设置为8K jr^btVOI#\
ty8E;['
"4.A@XsY
//资源列举完毕 D~ 7W
FMC]KXSd
{G{>Qa|
|zOwC9-6
or (Res NO_ERROR )//执行失败 aO*v"^oF
KuMH,rXF
n{"a0O
U Fyk%#L
Then Exit; iO}KERfU
1}OM"V
@Z
Dd(xB&
K/8TwB?I
P := TNetResourceArray(Buf); 4 Z&KR<2Z
seZb;0
^_uCSA'X
"MyMByomQ
For I := 0 To Count - 1 Do//记录各个网络类型的信息 iXqRX';F'}
y_2B@cj
ym2"D?P
(
U=[isi+7
Begin lOHW9Z
Y9B"yV
5)ooE
p+${_w>pl{
NetworkTypeList.Add(p); euET)Ccq
b
T** y?2
cpphnGj5
C9eisUM
Inc(P); ]aYuBoj
'|G8yojz
[x
-<O:r=P
{N@Pk[!
End; /b410NP5
1+qP7 3a^
uz;eYD
l6.&<0pLT
//WNetCloseEnum关闭一个列举句柄 <>V~
Ka$lNL3<j
e /L([
HP:[aR!2P
Res := WNetCloseEnum(lphEnum);//关闭一次列举 AL|3_+G
D{JwZL@7k2
mBQpf/PG
54oJMW9
If Res NO_ERROR Then exit; \og2\Oh&gH
I 1Yr{(ho
Nr`v|_U
@IOl0db
For J := 0 To NetworkTypeList.Count-1 Do //列出各个网络类型中的所有工作组名称 i\=I` Yn+
D0h6j0r5
C{,Vk/D-0
T75N0/teS
Begin//列出一个网络类型中的所有工作组名称 4K,S5^`Gx
m,ur{B8 :
o 80x@ &A:
{HjJ9ZGQ
NetResource := TNetResource(NetworkTypeList.Items[J]^);//网络类型信息//获取某个网络类型的文件资源的句柄,NetResource为网络类型信息,lphEnum为返回名柄 \ZBz]rh*
\xmDkWzE
_AH_<Z(
<|hrmwk|
Res := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_DISK, So4#n7
$dug"[
kkXe= f%
){KrBaGa4
RESOURCEUSAGE_CONTAINER, @NetResource,lphEnum); Ho $+[K
kH4m6p
fr&p0)85>B
j_S3<wEJ
If Res NO_ERROR Then break;//执行失败 1D%E})B6
8tzL.P^
a >k9&
w
yGH')TsjD
While true Do//列举一个网络类型的所有工作组的信息 1G'pT$5&
co'qVsOiH
:N'
;s#]."v_=
Begin x!u6LDq0
e1hf{:&/G@
,Bj]j -\Y
vgi`.hk
Count := $FFFFFFFF;//不限资源数目 .I%B$eH
=>7czw:S1
/Z]hX*QR
Fzz9BEw(i
BufSize := 8192;//缓冲区大小设置为8K & d* bQv$
7**zO3
H
m<!CF3g
_S CY e
GetMem(Buf, BufSize);//申请内存,用于获取工作组信息 jH<,dG:{
L5CnPnF
BL%3[JQ
KVoM\ttP
//获取一个网络类型的文件资源信息, AOx8OiqE:
'Y]<1M>.g
MPLeqk$;
tZ:fOM
Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize); ACF_;4%&
.:tR*Kst`7
"WH
&BhQYD
wd1>L) T
If ( Res = ERROR_NO_MORE_ITEMS ) //资源列举完毕 SRrp=>w?
^[v>B@p*{
lo36b zbT
!"'@c
or (Res NO_ERROR) //执行失败 <)o xs]<
o_ r{cnu
^$<:~qq!
OOYdrv,
then break; Vc+~yh.)
;}k_
i'}"5O+
N5b&tJbM0
P := TNetResourceArray(Buf); N8X)/W
TBgiA}|\D
fqn;,!D?9
N<QLvZh
For I := 0 To Count - 1 Do//列举各个工作组的信息 WrR8TYq9D]
ZQmg;L&7
$B OpjDV8
{<i(aq?
Begin '@"A{mrE
<XzRRCYQ
='(;!3ZH
EpENhC0
List.Add( StrPAS( P^.lpRemoteName ));//取得一个工作组的名称 B'6(Ao=3/
}RQ'aeVl(
?:W=ddg
d%oHcn
Inc(P); (>dL
q'jInwY|x
T? ,Q=.
#vTF:r
End; 6>h"Lsww
|2I
p*
4hUUQ;xj
Nl{on"il
End; mHNqzdaa
xP 3>8Y
SnoEi~Da
,;yaYF6|/
Res := WNetCloseEnum(lphEnum);//关闭一次列举 t<cWMx5ra
j0S[JpoF
ZOL#Q+U
1c`Yn:H^
If Res NO_ERROR Then break;//执行失败 Ua+Us"M3}
MED_#OS
Ljk0K3Q6>
TH+TcYqO
End; +^a@U^V
MU1T="N^+
ShOB"J-
YV6w}b:
Result := True;
kb'l@d#E
D
\boF+^
dkZ[~hEQG-
Ky{C;7X
FreeMem(Buf); ~P9^4
x8&~
C3; d.KlV
7[8d-Sf24{
NetworkTypeList.Destroy; g]._J
5~"m$/yE
End; P2 +^7x?
xic&m5j
m
Q5;EQ.#
?<soX8_1
二、列举一个工作组中的计算机名称 L(BL_
AUR{O
5ma~Pjt8}
hy@e(k|S]U
在WNetOpenEnum函数中,将参数lpNetResource中的lpRemoteName部分指定为一个工作组的名称(如“MyWorkGroup”),可以获取一个句柄,在WNetEnumResource中利用这个句柄,可以获取一个NetResource类型的数组,每个NetResource元素的lpRemoteName部分即为一个计算机名称(如“\\wangfajun”)。 >
Cx;h=
_Tf0L<A'R
q_:B=w+bC
-J++b2R\%
具体的请参见以下程序段及注释信息。 EyV6uk~
1(4IcIR5T;
N'8}5Kx5
))uki*UNK
NetResource.lpRemoteName := @GroupName[1];//指定工作组名称 1@`mpm#Y
$PTl{
=`wnng5m
\Qz
NetResource.dwDisplayType := RESOURCEDISPLAYTYPE_SERVER;//显示类型为服务器(工作组) 7[(<t+
G3t\2E9S
`R:HMO[ow
9Oc(Gl5az
NetResource.dwUsage := RESOURCEUSAGE_CONTAINER; -[7S.
h>n<5{zqM
xQ8?"K;iX
\eS-wO7%
NetResource.dwScope := RESOURCETYPE_DISK;//列举文件资源信息 _({K6adb
0EUC8Ni
'>UQsAvm
PL7_j
//获取指定工作组的网络资源句柄 Yn-;+ 4 K
|A:+[35
"@&I*1&
YGkk"gFIA
Res := WNetOpenEnum( RESOURCE_GLOBALNET, RESOURCETYPE_DISK, ~)!vhdBe
IaRq6=[
t8S,C4
y3mJO[U0 a
RESOURCEUSAGE_CONTAINER, @NetResource,lphEnum); W$u/tRF
J ?H|"
P\.1w>X
O%busM$P)/
获取计算机名称的完全程序源代码如下: 'U4@Sax,
G+jcR; s
yA-UXKT
i>AKXJ+
//列举出指定工作组GroupName中的计算机名称,返回值为TRUE表示执行成功,//参数List中返回计算机名称Function GetUsers( GroupName : string; var List : TStringList ) : Boolean;Var \oAxmvt
=/qj vY
> 0NDlS%Q:
OeY+Yt0
NetResource : TNetResource; ?L6ACi`9
qeoj
"z ;ky8
"?Xb$V7
Buf : Pointer; yI}_
U
+L<x0-&
u[1'Ap
"pkn
Count,BufSize,Res : DWord; x-ZCaa}O
c!>",rce
T\$r|
oA$]%
Ind : Integer; Ed&M
#wZBWTj.
Z<6Fq*I
='GY:. N
lphEnum : THandle; @`#"6y?
>,QW74o
_;`g*Kx
]iVoF N}^
Temp : TNetResourceArray; Rac4a@hZ
>-<