Einzelnen Beitrag anzeigen

oki

Registriert seit: 30. Dez 2002
Ort: Brandshagen
1.819 Beiträge
 
Delphi 2007 Professional
 
#6

Re: Share zu Laufwerksbuchstabe finden?

  Alt 28. Mai 2009, 14:30
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
42
  Mit Zitat antworten Zitat