Forklaring af kode

Tags:    delphi

Først koden:
Fold kodeboks ind/udKode 


Derpå opgaven: Jeg forstår skam godt kodens funktion, jeg forstår dog ikke hvorfor den gør som den gør. Skær koden ud i pap for mig og tjen 200 UPs.
(Steder hvor [i-] optræder er blot i indkapslet mellem [ og ] ! Tankestregen er sat for at undgå eHTML'ets påvirkning!)

// Kasper

[Redigeret d. 06/05-05 17:04:09 af KasperTech]



9 svar postet i denne tråd vises herunder
2 indlæg har modtaget i alt 6 karma
Sorter efter stemmer Sorter efter dato
Her kommer hele den første funktion med kommentarer:
Fold kodeboks ind/udKode 


[Redigeret d. 13/07-05 11:28:20 af Kasper Fabæch Brandt]



Først koden:
var
EnumHandle: THandle;
BufSize: DWord;
Res: DWord;
begin
Result := False;
List := Nil;
Entries := 0;
if WNetOpenEnum(RESOURCE_GLOBALNET,
ResourceType,
0,
NetResource,
EnumHandle) = NO_ERROR then begin
try


Uhm?? try? Er det her VB kode?
Har du glemt at poste modulerne?

Med Venlig Hilsen
Morten Torndahl Pedersen



Uhm?? try? Er det her VB kode?
Har du glemt at poste modulerne?

Med Venlig Hilsen
Morten Torndahl Pedersen


Det er Object Pascal kode, derfor posted under Delphi.
Nej, koden du ser der virker.
Modulerne du omtaler her regner jeg med dem man tilføjer under Uses, og nej... der er ikke nogen ekstra krævede.

// Kasper



Okay et lille stykke af gangen. Funktionen CreateNetResourceList bruger API kaldene WNetOpenEnum, WNetEnumResource, og WNetCloseEnum til at finde alle resource på netværket. Så jeg starter med at forklare hvordan disse funktioner fungerer. Microsofts dokumentation er at finde på: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wnet/wnet/wnetopenenum.asp og http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wnet/wnet/wnetenumresource.asp
og http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wnet/wnet/wnetcloseenum.asp

WNetOpenEnum
Denne funktion tager 5 parametrer, og retunere en DWORD = 32 bit unsigned. Funktionen starter en gennemgang af netværksresourcerne. Derefter kan man gå gennem netværksresourcerne med WNetEnumResource.
Den første parameter (dwScope) angiver hvilken "del" af netværket som der skal findes resourcer i. Denne kan bl.a. være alle netværks resource som allerede er åbne.
Den 2. parameter (dwType) fortæller hvilken type netværksresourcer der skal findes (printere eller mapper / diske).
Den 3. parameter (dwUsage) fortæller hvordan resourcerne skal kunne bruges. Dvs. f.eks. hvad man har rettighedder til.
Den 4. parameter (lpNetResource) er den netværks resource som der skal findes underelementerne til. Parameteren er en pointer til en TNetResource = NETRESOURCE struktur.
(http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wnet/wnet/netresource_str.asp)
. Hvis denne parameter er nil vil WNetEnumResource retunere alle rod resourcerne.
Den 5. og sidste parameter (lphEnum) er den variabel som handlen, til brug i WNetEnumResource, retuneres.
Funktionens returværdi er NO_ERROR vis det gik godt, og en fejlværdi ellers.


[Redigeret d. 11/07-05 11:25:07 af Kasper Fabæch Brandt]



WNetEnumResource
Denne funktion laver selve gennemgangen af netværksresourcerne. Den har 4 parametre og returnerer en DWORD. Den 1. parameter (hEnum) er handlen fra WNetOpenEnum.
Den 2. parameter (lpcCount) er antallet af resourcer som skal returneres af gangen. Hvis denne er DWORD(-1) = 2^32-1 = 4294967295 retuneres alle, eller så mange som der er plads til i bufferen (lpBuffer).
Den 3. parameter (lpBuffer) er en pointer til bufferen, hvor informationerne om netværksresourcerne skal gemmes. Bufferen kommer til at indeholde et array af TNetResource, og derefter alle strengværdierne som PChars'ne i TNetResource'erne peger på.
Den 4. parameter (lpBufferSize) fortæller hvor stor lpBuffer er. Hvis der ikke er plads til eet helt element, returneres størrelsen på det første element her.

Funktionen returnerer ERROR_MORE_DATA hvis der ikke var plads til det første element, ERROR_NO_MORE_ITEMS hvis der ikke er flere netværks resourcer, og NO_ERROR hvis der blev returneret et eller flere netværks resourcer.
Bemærk at ved ERROR_MORE_DATA vil funktionen forsøge at returnerer de samme elementer igen ved næste kald, mens den ved NO_ERROR vil returnere de elementer som ikke blev returneret ved første kald

WNetCloseEnum
Denne funktion er ret meget lige ud af landevejen. Den lukker og frigør en handle fra WNetOpenEnum. Den tager en parameter - den handle som skal lukkes, og den returnere NO_ERROR hvis alt gik godt, og en fejlværdi ellers.

[Redigeret d. 11/07-05 12:30:35 af Kasper Fabæch Brandt]



Først typedeklareringen
Fold kodeboks ind/udKode 


Der deklareres et array (TNetResourceArray) med 101 (0-100) elementer af typen TNetResource. PNetResourceArray deklareres som en pointer til TNetResourceArray.

[Redigeret d. 13/07-05 11:27:33 af Kasper Fabæch Brandt]



Funktionen CreateNetResourceList starter med at blive deklareret:
Fold kodeboks ind/udKode 

Den tager 4 parametre. ResourceType er en DWord = 32 bit unsigned. NetResource er en PNetResource = en pointer til en TNetResource. Disse to paramtre er konstante (dvs. at funktionen kun kan læse fra dem, men ikke skrive til dem). Derefter kommer to out parametre (funktionen kan skrive til dem men ikke læse fra dem). Den ene hedder Entries og er en DWord. Den anden hedder List og er en PNetResourceArray som blev deklareret før. Funktionen returnerer en Boolean (true eller false).

Så deklareres variablerne:
Fold kodeboks ind/udKode 

EnumHandle er en THandle (en WinAPI handle = DWord)
BufSize og Res er begge DWord.

Her starter fuktionen
Fold kodeboks ind/udKode 

Funktionens resultat indikerer om alting gik godt. Resultatet initialiseres til false så funktionen returnerer dette hvis noget går galt. List bliver initialiseret til ikke at pege på noget, og Entries bliver sat til 0.

[Redigeret d. 13/07-05 11:29:52 af Kasper Fabæch Brandt]



Huh? Jeg nåede ikke engang at forklarer det hele. Nå men jeg går ud fra at det jeg skrev var nok... Tak for UP'ne



Huh? Jeg nåede ikke engang at forklarer det hele. Nå men jeg går ud fra at det jeg skrev var nok... Tak for UP'ne


Du må endelig gerne skrive mere, hvis du lyster :)
(Du kan sågar få UP for det)

// Kasper



t