Einzelnen Beitrag anzeigen

Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.685 Beiträge
 
Delphi 11 Alexandria
 
#11

AW: Netzwerk-Adresse/UNC-Pfad zu normalem Pfad konvertieren

  Alt 23. Feb 2021, 12:59
Delphi-Quellcode:
unit uMain;

interface

uses

Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,

 Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls;

type

TfrmMain = class(TForm)
   pnlMain: TPanel;
   pnlServer: TPanel;
   lblServer: TLabel;
   edtServer: TEdit;
   pnlShare: TPanel;
   lblShare: TLabel;
   edtShare: TEdit;
   pnlResolve: TPanel;
   pnlButton: TPanel;
   btnResolve: TButton;
   edtResult: TEdit;
   procedure btnResolveClick(Sender: TObject);
end;

var
 frmMain: TfrmMain;

implementation

{$R *.dfm}

const
  netapi = 'netapi32.dll';

function NetApiBufferFree(Buffer: Pointer): DWORD; stdcall; external netapi;
function NetShareGetInfo(ServerName, NetName: PWideChar; Level: DWORD; out Buffer: Pointer): DWORD; stdcall; external netapi;

function GetSharePath(const ServerName, ShareName: string): string;
const
  NERR_Success = 0;
type
  PShareInfo2 = ^TShareInfo2;
  TShareInfo2 = record
    shi2_netname: PWideChar;
    shi2_type: DWORD;
    shi2_remark: PWideChar;
    shi2_permissions: DWORD;
    shi2_max_uses: DWORD;
    shi2_current_uses: DWORD;
    shi2_path: PWideChar;
    shi2_passwd: PWideChar;
  end;
var
  ErrorCode: DWORD;
  Buffer: Pointer;
begin
  Result := '';
  ErrorCode := NetShareGetInfo(PWideChar(ServerName), PWideChar(ShareName), 2, Buffer);
  try
    if (ErrorCode = NERR_Success) then
      Result := PShareInfo2(Buffer)^.shi2_path;
  finally
    NetApiBufferFree(Buffer);
  end;
end;

procedure TfrmMain.btnResolveClick(Sender: TObject);
begin
// Wenn UNC-Pfad so in etwa ausschaut " \\MyServer\MyShare\MyData\MyFiles\SomeFile.txt "
// String in 3 Teile zerlegen und die Edit Felder so bestücken
// Teil 1: edtServer.Text = \\MyServer (Wichtig, mit zwei \\ beginnen!)
// Teil 2: edtShare.Text = MyShare (Wichtig, nur den Share-Namen ohne \)
  edtResult.Text := GetSharePath(edtServer.Text, edtShare.Text);
// und als ergebnis bekommt man den Pfad zu "MyShare"
// Teil 3: den Rest des Strings wieder rankleben und es sollte funzen.

// getestet mit Delphi Rio 32bit build / aktuelles Windows 10 / Lokal erstelltes Share

// Ungetestet: Share's die per Username/Passwort gesichert sind...

end;

end.
Gruß vom KodeZwerg

Geändert von KodeZwerg (23. Feb 2021 um 13:59 Uhr) Grund: Copy-paste fehler
  Mit Zitat antworten Zitat