Zitat von
raiguen:
API-Funktion(en): WNetOpenEnum, WNetEnumResource, WNEtCloseEnum... sh auch
Win32 Developers Refernez für weitere Information(en).
Beispiel für die Verwendung findest Du
hier
Hallo Leute,
das Code-Beispiel aus dem Swissdelphicenter auf das hier verwiesen wird hat einen Bug. Er führt zu einem Specherleck. Der Fehler steckt hier:
Delphi-Quellcode:
repeat
lpnrDrv := PNETRESOURCE(GlobalAlloc(GPTR, cbBuffer));
dwResult := WNetEnumResource(hEnum, cEntries, lpnrDrv, cbBuffer);
if (dwResult = NO_ERROR) then
begin
s := 'Network drives:'#13#10;
for i := 0 to cEntries - 1 do
begin
if lpnrDrv^.lpLocalName <> nil then
s := s + lpnrDrv^.lpLocalName + #9 + lpnrDrv^.lpRemoteName;
Inc(lpnrDrv); // hier wird die Adresse Incrementiert
end;
end
else if dwResult <> ERROR_NO_MORE_ITEMS then
begin
s := s + 'Cannot complete network drive enumeration';
GlobalFree(HGLOBAL(lpnrDrv));
break;
end;
GlobalFree(HGLOBAL(lpnrDrv)); // hier wird nicht die allociierte Speicheradresse sondern die incrementierte Adresse angegeben
until (dwResult = ERROR_NO_MORE_ITEMS);
Entweder man merkt sich die Startadresse für lpnrDrv oder man decrementiert die Adresse um genau die Anzahl, um die sie incrementiert wurde.
So führt das zu bösen Speicherlecks.
Gruß Oki