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.