Announcement

Collapse
No announcement yet.

Ist ein Verzeichniss freigegeben??

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Ist ein Verzeichniss freigegeben??

    hallo<br>
    <br>
    ich würde gerne verzeichnisse darauf prüfen, ob sie im windowsnetzwerk freigegeben wurden und wenn ja, wie die freigabe heisst, damit man den UNC-pfad auch auf anderen rechnern im netzwerk verwendet werden kann
    <br>
    <br>
    danke im voraus
    <br>
    raimund

  • #2
    Hallo Raimund,<br>
    <br>
    dafür kannst Du NetShareEnum benutzen mit der Struktur SHARE_INFO_0, bzw. WNetEnumResource,<br>
    falls Dir der lokale Rechner und die sichtbaren Freigaben reichen.<br>
    In der Win 32 Dokumentation die bei Delphi beiliegt, ist NetShareEnum zwar als 'obsolete' angegeben<br>
    (man soll als Ersatz WNetEnumResource verwenden), laut SDK sieht das allerdings anders aus.<br>
    Da Delphi die Funktion nicht deklariert hat (sie ist ja schliesslich überflüssig), habe ich angefangen<br>
    mir die LMSHARE.H zu übersetzen. Für NT/2000 sieht das dann so aus:<br>
    <br>
    <pre>
    const // aus LMConst.h
    MAX_PREFERRED_LENGTH = DWORD(-1);

    type // aus LMConst.h
    NET_API_STATUS = DWord;

    function //LMAPIBuf.h
    NetApiBufferFree (
    const Buffer : Pointer
    ) : NET_API_STATUS; stdcall; external 'netapi32.dll' name 'NetApiBufferFree';

    function // LMShare.h
    NetShareEnum (
    const servername : PWideChar;
    const level : DWord;
    const bufptr : Pointer;
    const prefmaxlen : DWord;
    const entriesread : PDWord;
    const totalentries : PDWord;
    const resume_handle : PDWord
    ) : NET_API_STATUS; stdcall; external 'netapi32.dll' name 'NetShareEnum';

    //
    // Data Structures - Share
    //
    type
    SHARE_INFO_0 =
    packed record
    shi0_netname : PWideChar;
    end;

    SHARE_INFO_1 =
    packed record
    shi1_netname : PWideChar;
    shi1_type : DWord;
    shi1_remark : PWideChar;
    end;

    //
    // Share types (shi1_type and shi2_type fields).
    //
    const
    STYPE_DISKTREE = 0;
    STYPE_PRINTQ = 1;
    STYPE_DEVICE = 2;
    STYPE_IPC = 3;
    STYPE_SPECIAL = $80000000;

    // Beispiel:

    procedure TForm1.Button1Click(Sender: TObject);

    type
    PSHARE_INFO_1 = ^SHARE_INFO_1;

    var
    Buffer : PSHARE_INFO_1;
    dwEntries : DWord;
    dwTotal : DWord;
    lIndex : DWORD;
    dwResult : DWord;
    p : PSHARE_INFO_1;
    sComputer : String;
    sShareType : String;

    begin
    lIndex := 0;
    sComputer := '';
    dwResult := NetShareEnum(
    PWideChar(sComputer),
    1,
    @Buffer,
    MAX_PREFERRED_LENGTH,
    @dwEntries,
    @dwTotal,
    @lIndex
    );
    if (dwResult = ERROR_SUCCESS)
    or
    (dwResult = ERROR_MORE_DATA) then
    begin
    p := Buffer;
    for lIndex := 1 to dwEntries do
    begin
    Memo1.Lines.Add(p.shi1_netname);
    Case p.shi1_type of
    STYPE_DISKTREE :
    sShareType := 'Disk Drive';
    STYPE_PRINTQ :
    sShareType := 'Print Queue';
    STYPE_DEVICE :
    sShareType := 'Communication device';
    STYPE_IPC :
    sShareType := 'Interprocess communication (IPC)';
    STYPE_SPECIAL :
    sShareType := 'Administrative Share / IPC';
    else
    begin
    sShareType := 'Unknown';
    end;
    end;
    Memo1.Lines.Add(sShareType);
    Memo1.Lines.Add(p.shi1_remark);
    inc(p);
    end;
    end;
    NetAPIBufferFree(Buffer);
    end;
    </pre>
    <br>
    Diese Variante funktioniert allerdings nur unter NT/2000. Für W9x/ME sehen die Deklarationen anders aus.<br>
    Da bin ich noch dran.<br>
    Da die Funktion sich den Speicher für den Buffer selber besorgt, muss dieser mit NetApiBufferFree<br>
    wieder freigegeben werden.<br>
    <br>
    Ciao<br>
    Chri

    Comment


    • #3
      hallo Christian<br><br>

      ich verwende zur zeit Win98, so das mir deine Übersetzung leider nicht sehr viel weiter hilft.
      <br>
      Ich habs dann mal mit WNetEnumResource versucht, bin aber zu keinem brauchbaren Ergebniss gekommen (ich hab leider keinerlei Erfahrung mit Win32API-Programmierung)
      Könntest du mir eventuell ein kleines Beispiel zu diesem Thema zukommen lassen, so daß ich wieder ein Einstrieg hätte??
      <br>
      <br>
      danke im voraus
      <br>
      Raimun

      Comment

      Working...
      X