Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Share zu Laufwerksbuchstabe finden? (https://www.delphipraxis.net/107465-share-zu-laufwerksbuchstabe-finden.html)

Bernhard Geyer 28. Jan 2008 12:08


Share zu Laufwerksbuchstabe finden?
 
Mit welcher API-Funktion kann man das Share-Verzeichnis bekommen das verwendet wurde um einen Laufwerksbuchstaben zu verbinden?

Also für "X:" das Share "\\ServerName\Share" bekommen.

raiguen 28. Jan 2008 13:05

Re: Share zu Laufwerksbuchstabe finden?
 
API-Funktion(en): WNetOpenEnum, WNetEnumResource, WNEtCloseEnum... sh auch Win32 Developers Refernez für weitere Information(en).
Beispiel für die Verwendung findest Du hier

gammatester 28. Jan 2008 13:28

Re: Share zu Laufwerksbuchstabe finden?
 
Reicht nicht ein einfaches

Delphi-Quellcode:
ExpandUNCFileName('X:\')

raiguen 28. Jan 2008 13:50

Re: Share zu Laufwerksbuchstabe finden?
 
@gammatester: hm, im Prinzip ja...wenn ich denn weiss, wie der Laufwerkbuchstabe heisst...
Die WNet-API-Funktionen zeigen (je nach Parameter) die verwendeten(=aktiven) Netzverbindungen oder die 'gemerkten' und, und...

Bernhard Geyer 28. Jan 2008 14:02

Re: Share zu Laufwerksbuchstabe finden?
 
Zitat:

Zitat von raiguen
API-Funktion(en): WNetOpenEnum, WNetEnumResource, WNEtCloseEnum... sh auch Win32 Developers Refernez für weitere Information(en).

Danke für die API-Namen

Zitat:

Zitat von raiguen
Beispiel für die Verwendung findest Du hier

Irgendwie kracht es ab dem 2ten Mal das die Liste geholt wird. Die Variable cEntries ist beim zweiten durchlauf 0 und die for-schleife "verrennt" sich damit.
Aber wieso die Variable cEntries 0 ist, ist mir nicht klar.


Zitat:

Zitat von gammatester
Reicht nicht ein einfaches

Delphi-Quellcode:
ExpandUNCFileName('X:\')

Danke, für meine zwecke reicht es, auch wenn es schön wäre den Fehler bei den Schweizern zu kennen (um eigene Helper-Methode für andere Zwecke zu schreiben).

oki 28. Mai 2009 14:30

Re: Share zu Laufwerksbuchstabe finden?
 
Zitat:

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

paritycheck 29. Mai 2009 10:21

Re: Share zu Laufwerksbuchstabe finden?
 
Hi,

habe vor kurzem hier ne Funktion dazu gepostet.

Gruß
Michael

oki 29. Mai 2009 10:34

Re: Share zu Laufwerksbuchstabe finden?
 
Hallo PartyCheck,

ja, das hier listet aber erst mal nur alle eingetragenen Netzwerkverbindungen auf, unabhängig davon, ob eine Verbindung etabliert ist oder nicht. Mein Kommentar bezog sich darauf, das die gepostete Funktion ein Speicherleck verursacht.

Gruß oki

paritycheck 29. Mai 2009 10:58

Re: Share zu Laufwerksbuchstabe finden?
 
Zitat:

Zitat von oki
ja, das hier listet aber erst mal nur alle eingetragenen Netzwerkverbindungen auf, unabhängig davon, ob eine Verbindung etabliert ist oder nicht. Mein Kommentar bezog sich darauf, das die gepostete Funktion ein Speicherleck verursacht.

Ok hatte den Thread nur schnell überflogen :oops: Das hätte ich jetzt mit GetLogicalDrives und GetDriveType gelöst aber die Lösung der Schweizer zusammen mit deinem Fix ist wohl eleganter. :thumb:

oki 29. Mai 2009 11:38

Re: Share zu Laufwerksbuchstabe finden?
 
Hi, nicht unbedingt eleganter, aber dieser Code listet auch alle Laufwerksbuchstaben auf die für Netzwerkverbindungen reserviert aber nicht aktiv sind. GetLogicalDrives tut dies nicht.

Gruß


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:51 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz