Paste from 《Delphi超级猛料1》
uses Registry
var
  MyReg:TRegistry;
//以下为注册表修改
  MyReg:=TRegistry.Create ;
  MyReg.RootKey :=HKEY_LOCAL_MACHINE;MyReg.OpenKey ('\SOFTWARE\Microsoft\Windows\CurrentVersion\Network\LanMan\C',True)
    begin
      MyReg.WriteInteger('Flags',258);  //共享为完全共享
      MyReg.WriteInteger('Type',0);
      MyReg.WriteString('Path','C:\');//共享
      MyReg.WriteString('Re','');
      MyReg.CloseKey ;
    end;见笑了
***************
DELPHI 关于WIN9X下共享文件夹问题
作者:房客(Jason)
经常看到有人问起如何在程序中增加和删除共享文件夹,于是就尽可能把相关信息写出来,更深入答案还请大虾共同讨论。
    共享/删除共享可以直接调用标准的Win32API函数 NetShareAdd()和NetShareDel()。
    建立共享目录函数:Function NetShareAdd(servername:PChar; level:SmallInt;buf:Pointer; buf_len:SmallInt):SmallInt;far;stdcall;external 'svrapi.dll';
    撤销共享目录函数:Function NetShareDel(servername:PChar;buf:Pointer; reserved:SmallInt):SmallInt;far;stdcall;external 'svrapi.dll';
这里再提供两个关于连接共享目录/撤销共享目录函数WnetAddConnection和WnetCancelConnection。
关于映射网络驱动器的方法如下:
WNetAddConnection(%共享目录名%,%口令%,'X:'); //映射X盘
WNetCancelConnection('X:',True); //撤销X盘映射
    关于建立/撤消共享的函数返回变量说明如下:
const NETNAME_LEN = 13;PASSWORD_LEN = 9;SHI50F_RDONLY = $0001;
    SHI50F_FULL = $0002;SHI50F_DEPENDSON  = $0003;
    SHI50F_ACCESSMASK = $0003;SHI50F_PERSIST = $0100;
    SHI50F_SYSTEM  = $0200;STYPE_DISKTREE = 0;
    STYPE_PRINTQ = 1;STYPE_DEVICE = 2;
    STYPE_IPC = 3;NERR_Success = 0;
NERR_BASE = 2100;  //常量说明
NERR_UnKnownDevDir=(NERR_BASE+16);NERR_UnknownServer=(NERR_BASE+3);
NERR_ServerNotStarted=(NERR_BASE+14);NERR_RedirectedPath=(NERR_BASE+17);
NERR_DuplicateShare=(NERR_BASE+18);NERR_BufTooSmalll=(NERR_BASE+23); //NetShareAdd返回错误
NERR_NetNotStarted = (NERR_BASE+2);
NERR_ServerNotStarted = (NERR_BASE+14);
NERR_NetNameNotFound = (NERR_BASE+210);
NERR_ShareNotFound = (NERR_BASE+292); //NetShareDel返回错误
  SHARE_INFO_50=Record
    netname:array [0..NETNAME_LEN-1] of Char;
    sharetype:ShortInt;
    flags:SmallInt;
    re:PChar;
    path:PChar;
    rw_password:array [0..PASSWORD_LEN-1] of Char;
    ro_password:array [0..PASSWORD_LEN-1] of Char;
  End; //以上为类型定义
    再有就是关于Window9X共享目录口令问题(其实屏保口令也是同样保存的),口令(原始为十六进制字符)在注册表位置:HKEY_LOCAL_MACHINE\SOFTWARE\micorsoft\windows\current_version\network\lanman\共享文件夹名\Parm1enc和Parm2enc两位置,Parm1enc为对应的是完全共享密码,Parm2enc对应的是只读共享密码。字符与数列(前八个数是35,9A,4D,A6,53,A9,D4,6A)作异或运算即得密码的二进制ASCII码,转换后可得到密码。
    另外提供一个比较幼稚但可行的方案(在注册表做动作):
var reg : TRegistry; name : String; //s是在网上邻居里的文件夹名
begin
  name := 'DirName';//建立一个只读,无密码共享目录
  reg := TRegistry.Create;
  reg.RootKey := HKEY_LOCAL_MACHINE;
  reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\Network\LanMan\'+name,true );
  reg.WriteInteger( 'Flags', 401 ) ; //权限:401代表为访问,258为完全访问,259为密码访问
  reg.WriteInteger( 'Parm1enc', 0 ) ;  //参数2,放置完全访问密码,已加密
  reg.WriteInteger( 'Parm2enc', 0 ) ;  //参数2,放置只读访问密码,已加密
  reg.WriteString( 'Path', 'C:\MYDIR' ) ; //放置要共享的目录的绝对路径
  reg.WriteString( 'Re', '' ) ;
  reg.WriteInteger( 'Type', 0 ) ; 
end;
这样的缺点就是要重启系统,可以ExitWindowsEx( EWX_FORCE and EWX_SHUTDOWN , 0 )来重启。
此外你还可以使用控件File Sharing 95/98,该控件包含了几个方便的function:ShareResource、DeleteShare、GetShareInfo、SetShareInfo、GetNetErrorString等。
    附:关于NetUserAdd等相关API
WNetCloseEnum                           结束网络资源列表
WNetConnectionDialog                    开始网络连接对话框
WNetDisconnectDialog                    断开网络对话框
WNetEnumResource                        继续列表网络资源
WNetGetConnection                       获取网络资源名
WNetGetLastError                        返回网络函数最近错误
WNetGetUser                             获取当前网络用户名
WNetOpenEnum                            列出网络资源

解决方案 »

  1.   

    enlightenment(阿明--进入准冬眠状态的超人):能不能贴个例了出来,我老是用不成,在此多谢了。 
      

  2.   


    Paste from LoveJingTao
    unit My_Share;interface
    uses
       SysUtils;
    type
      Share_Info50 = packed record
        shi50_netname: array[0..12] of Char; {13}
        shi50_type: Byte;
        shi50_flags: Word;
        shi50_re: PChar;
        shi50_path: PChar;
        shi50_rw_password: array[0..8] of Char; {9}
        shi50_ro_password: array[0..8] of Char;
      end;
    const        
      STYPE_DISKTREE = 0; {磁盘共享}
      STYPE_PRINTQ = 1; {打印机共享}
      SHI50F_RDONLY = 1; { 只读共享}
      SHI50F_FULL = 2; { 完全共享}
      SHI50F_DEPENDSON = (SHI50F_RDONLY or SHI50F_FULL); {进入需要口令}  SHI50F_PERSIST = 256; {此选项:计算机重新启动后才生效}
      SHI50F_SYSTEM = 512; {此选项:即时生效,且击右键无法看到共享}
    function ShareResource(ServerName: PChar; FilePath: PChar;
      NetName: PChar; Re: PChar;
      ShareType: Byte; Flags: Word;
      RWPass: PChar; ROPass: PChar): Integer;
      function DeleteShare(ServerName: PChar; NetName: PChar): Integer;
    function NetShareAdd(ServerName: PChar; ShareLevel: SmallInt; Buffer: Pointer; Size: Word): Integer; StdCall;
    function NetShareDel(ServerName: PChar; NetName: PChar; Reserved: Word): Integer; StdCall;implementationfunction ShareResource(ServerName: PChar; FilePath: PChar;
      NetName: PChar; Re: PChar;
      ShareType: Byte; Flags: Word;
      RWPass: PChar; ROPass: PChar): Integer; {目录共享}
    var
      MyShare: Share_Info50;
      PMyShare: ^Share_Info50;
    begin
      strLcopy(MyShare.shi50_netname, NetName, 13);
      MyShare.shi50_type := ShareType;
      MyShare.shi50_flags := Flags;
      MyShare.shi50_re := Re;
      MyShare.shi50_path := FilePath;
      strLcopy(MyShare.shi50_rw_password, RWPass, 9);
      strLcopy(MyShare.shi50_ro_password, ROPass, 9);
      PMyShare := @MyShare;
      Result := NetShareAdd(ServerName, 50, PMyShare, SizeOf(MyShare));
    end;function DeleteShare(ServerName: PChar; NetName: PChar): Integer; {撤消共享目录}
    begin
      Result := NetShareDel(ServerName, NetName, 0);
    end;function NetShareAdd; external 'SVRAPI.DLL';
    function NetShareDel; external 'SVRAPI.DLL';{注意:NT/2000下要改为NETAPI32.DLL,可以在程序中判断系统来加载不同的DLL }
    end.