Ik bezig met een programmatje dat bestandjes moet gaan zoeken over het netwerk in alle beschikbare werkgroepen die er zijn. Hiervoor zijn (uiteraard) een paaar handige functies opgenomen in delphi te weten: WNetOpenEnum, WNetEnumResource en WNetCloseEnum. Ook te vinden in de Win32 SDK.
De drie maken gebruik van een structure dat gedefinieerd is al packed record onder de naam TNetResourceA en is te bereiken met een pointer PNetResourceA. Het zoeken duurt echter verschrikkelijk lang, de werkgroepen en pc zijn zo gevonden maar de shares duurt echt verschrikkelijk lang.
Daarom wou ik de structures bewaren en in een thread op de achtergrond de shares opzoeken. Dit lukt echter maar gedeeltelijk. Op naar het probleem:
Als je een nieuwe variabele als pointer wil maken gebruikte je vroeger GetMem( pointer, size ), nu doen we dat met New. De pointer weggooien gebeurt vervolgens met Dispose( pointer ).
Maar nu, het kopieren van geheugen doen we met CopyMemory( destination, source, size), hier kom ik echter in de problemen. Het gekopieerde structure is niet altijd correct. Hier mijn code:
De structures worden in een TreeView opgeslagen. De const RESOURCEUSAGE_CONTAINER geeft aan dat we alleen zoeken naar groepen en pc's.
De structures in de tree zijn af en toe goed, dat is het vervelende. Ook als ik met de debugger step->run doe gaat het fout.
Please help.
De drie maken gebruik van een structure dat gedefinieerd is al packed record onder de naam TNetResourceA en is te bereiken met een pointer PNetResourceA. Het zoeken duurt echter verschrikkelijk lang, de werkgroepen en pc zijn zo gevonden maar de shares duurt echt verschrikkelijk lang.
Daarom wou ik de structures bewaren en in een thread op de achtergrond de shares opzoeken. Dit lukt echter maar gedeeltelijk. Op naar het probleem:
Als je een nieuwe variabele als pointer wil maken gebruikte je vroeger GetMem( pointer, size ), nu doen we dat met New. De pointer weggooien gebeurt vervolgens met Dispose( pointer ).
Maar nu, het kopieren van geheugen doen we met CopyMemory( destination, source, size), hier kom ik echter in de problemen. Het gekopieerde structure is niet altijd correct. Hier mijn code:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
| procedure TSearchGroups.GetGroups(const Parent: TTreeNode;
NetNode: PNetResourceA);
{ recurse through the network and find all available workgroups }
const
INITIALSIZE = $1;
var
tmpHEnum: THandle;
tmpCount, tmpBufSize: DWORD;
tmpNetResource, tmpBuf, tmpNRTree: PNetResourceA;
tmpNRE: Integer; // network-resource enumerator
tmpChildNode: TTreeNode;
tmpShrSearch: TSearchShares;
begin
{ open the net resources, search for containers only }
tmpNRE := WNetOpenEnum( RESOURCE_GLOBALNET, RESOURCETYPE_DISK,
RESOURCEUSAGE_CONTAINER, NetNode, tmpHEnum);
if tmpNRE <> NO_ERROR then
begin
Exit;
end;
tmpBufSize := $1;
GetMem(tmpBuf, tmpBufSize);
try
while True do
begin
tmpCount := $FFFFFFFF; // read all items
tmpNRE := WNetEnumResource(tmpHEnum, tmpCount, tmpBuf, tmpBufSize);
if tmpNRE = ERROR_MORE_DATA then
begin
{ the initial size is to smal }
tmpCount := $FFFFFFFF; // read all items
FreeMem(tmpBuf);
GetMem(tmpBuf, tmpBufSize);
tmpNRE := WNetEnumResource(tmpHEnum, tmpCount, tmpBuf, tmpBufSize);
end;
if tmpNRE = ERROR_NO_MORE_ITEMS then Break;
if tmpNRE <> NO_ERROR then
begin
{ if there's an error abort the search }
Abort;
end;
tmpNetResource := tmpBuf;
while tmpCount > 0 do
begin
//tmpChildNode := frmMain.tvNetwork.Items.AddChild(Parent,
// tmpNetResource.lpRemoteName);
//we need to save the structure, copy it
New(tmpNRTree);
CopyMemory(tmpNRTree, tmpNetResource, SizeOf(tmpNetResource^) );
tmpChildNode := frmMain.tvNetwork.Items.AddChildObject(Parent,
tmpNetResource.lpRemoteName, tmpNRTree);
GetGroups(tmpChildNode, tmpNetResource);
Inc( tmpNetResource );
Dec( tmpCount );
end; // while tmpCount > 0
end; // while R <> ERROR_NO_MORE_ITEMS
finally
WNetCloseEnum( tmpHEnum );
FreeMem( tmpBuf );
end; // try
end; |
De structures worden in een TreeView opgeslagen. De const RESOURCEUSAGE_CONTAINER geeft aan dat we alleen zoeken naar groepen en pc's.
De structures in de tree zijn af en toe goed, dat is het vervelende. Ook als ik met de debugger step->run doe gaat het fout.
Please help.
www.fendt.com | Nikon D7100 | PS5