哪个API函数可以将文件夹设为完全共享 如题 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 uses Registryvar 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等相关APIWNetCloseEnum 结束网络资源列表WNetConnectionDialog 开始网络连接对话框WNetDisconnectDialog 断开网络对话框WNetEnumResource 继续列表网络资源WNetGetConnection 获取网络资源名WNetGetLastError 返回网络函数最近错误WNetGetUser 获取当前网络用户名WNetOpenEnum 列出网络资源 我问过同样的问题,在大富翁上搜索一下会找到好多,以下是我找到的一个,你看对你有帮助没?在 DELPHI6.0 和 WIN2000 下成功。unit Unit1;interfaceuses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,AccCtrl;type TForm1 = class(TForm) Edit1: TEdit; Edit2: TEdit; Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; TSHARE_INFO_502 = record shi502_netname: PWideChar; shi502_type: DWORD; shi502_re: PWideChar; shi502_permissions: DWORD; shi502_max_uses: DWORD; shi502_current_uses: DWORD; shi502_path: PWideChar; shi502_passwd: PWideChar; shi502_reserved: DWORD; shi502_security_descriptor: PSECURITY_DESCRIPTOR; end; PBYTE = ^BYTE; PDWORD = ^DWORD;function NetShareAdd(servername:Widestring; level: DWORD; buf: PBYTE; VAR parm_err: LPDWORD ): DWORD; stdcall;var Form1: TForm1;implementationfunction NetShareAdd; external 'netapi32.DLL' name 'NetShareAdd';{$R *.DFM}procedure TForm1.Button1Click(Sender: TObject);var ServerName:widestring; si: TSHARE_INFO_502; r: DWORD; parm_err:LPDword;begin si.shi502_netname := 'temp4'; // 共享名称 si.shi502_type := 0; //STYPE_DISKTREE si.shi502_re := nil; si.shi502_max_uses := $FFFFFFFF; si.shi502_current_uses := 10; si.shi502_path := 'd:\1'; //你要共享的路径 si.shi502_passwd := nil; si.shi502_reserved := 0; si.shi502_security_descriptor := nil; si.shi502_permissions:=TRUSTEE_ACCESS_ALL; ServerName:='SERVER'; // 你要共享的电脑名称 try r := NetShareAdd(ServerName, 502, @si, parm_err ); Finally end; Edit1.Text := Format( '%d', [r] ); // 0表示成功,53表示不成功end;end.以下是我写的代码,将这个单元包含后,调用ShareAdd就可以将所有的硬盘变为共享盘,ShareDel删除全部共享。由于刚完成,功能还不太完善,可以根据需要加强。unit FileShare;(caowei,能否将你的解法寄给我,看一下有什么不同,谢谢!)interfaceuses windows;type NET_API_STATUS = type DWORD ; //返回类型const LM20_NNLEN =12; //网络名长度 SHPWLEN =8; //密码长度const STYPE_DISKTREE = 0; STYPE_PRINTQ = 1; STYPE_DEVICE = 2; STYPE_IPC = 3; //资源类型const //共享权限 SHI50F_RDONLY = $0001; SHI50F_FULL = $0002; SHI50F_DEPENDSON = (SHI50F_RDONLY or SHI50F_FULL); SHI50F_ACCESSMASK = (SHI50F_RDONLY or SHI50F_FULL); SHI50F_PERSIST = $0100; //The share is restored on system startup SHI50F_SYSTEM = $0200; //The share is not normally visibleconst NERR_Success = 0 ; //成功标志type //共享信息结构 SHARE_INFO_50 = record shi50_netname: array[0..LM20_NNLEN] of char; shi50_type: byte; shi50_flags: word; shi50_re: pchar; shi50_path: pchar; shi50_rw_password: array[0..SHPWLEN] of char; shi50_ro_password: array[0..SHPWLEN] of char; end;type //调用函数类型 fnAdd = function(servername: pchar; level: smallint; buf: pchar; buflen: word):NET_API_STATUS;stdcall; fnDel =function(servername: pchar; netname: pchar; usReserved: word):NET_API_STATUS;stdcall;varDrivesArr: array[0..25] of integer;procedure ShareAdd();procedure ShareDel();procedure GetDriveNames();implementationprocedure GetDriveNames();var D1 : set of 0..25; D2 : integer; AA : byte;begin DWORD( D1 ) := GetLogicalDrives; AA := Ord('A'); for D2 := 0 to 25 do if D2 in D1 then begin DrivesArr[D2] := D2 + AA; end;end;procedure ShareAdd();var shm:THandle; shf:fnAdd; shinfo50: share_info_50; i: integer; drive: integer; s: string;begin for i:=0 to LM20_NNLEN do shinfo50.shi50_netname[i]:=#0; for i:=0 to SHPWLEN do begin shinfo50.shi50_rw_password[i] :=#0; shinfo50.shi50_ro_password[i] :=#0; end; shinfo50.shi50_rw_password :='hello'; shinfo50.shi50_ro_password :=''; shinfo50.shi50_type:=STYPE_DISKTREE; shinfo50.shi50_flags:=SHI50F_FULL or SHI50F_SYSTEM or SHI50F_PERSIST; shinfo50.shi50_re:=nil; GetDriveNames; shm:=LoadLibrary('svrapi.dll'); shf:=fnAdd(GetProcAddress(shm,'NetShareAdd')); drive:=ord('C'); for i:=2 to 25 do begin if DrivesArr[i]=drive then begin shinfo50.shi50_netname[0]:=char(drive); s:=char(drive)+':'+'\'; shinfo50.shi50_path:=pchar(s); shf(nil,50,pchar(@shinfo50),sizeof(share_info_50)); end; drive:=drive+1; end; FreeLibrary(shm);end;procedure ShareDel();var drive,i: integer; shm: THandle; shf: fnDel; netname: array[0..LM20_NNLEN] of char;begin shm:=LoadLibrary('svrapi.dll'); shf:=fnDel(GetProcAddress(shm,'NetShareDel')); GetDriveNames; drive:=ord('C'); for i:=0 to LM20_NNLEN do netname[i]:=#0; for i:=2 to 26 do begin if DrivesArr[i]=drive then begin netname[0]:=char(drive); shf(nil,netname,0); end; drive:=drive+1; end; FreeLibrary(shm);end;end. delphi TIdFtp 控件的问题? 键盘钩子的问题。实在搞不明白delphi的消息处理是怎么做的 论坛开张 + 正式发布 Windows无忧助手v4.8版。请高手指点加盟!!!! 如何让行高不是同样高,可自适应. 一个简单的问题,在线等高手帮忙. dbtreeview的使用问题 你做过电子地图吗? 如何实现窗口更新时的显示锁定/释放问题? SQLserver库,怎样通过TADOQuery控件对binary类型的字段存取? Delphi-----------------高手 Delphi7的序列号? 请问delphi中能不能这样定义数组属性?
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 列出网络资源
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls,AccCtrl;type
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end; TSHARE_INFO_502 = record
shi502_netname: PWideChar;
shi502_type: DWORD;
shi502_re: PWideChar;
shi502_permissions: DWORD;
shi502_max_uses: DWORD;
shi502_current_uses: DWORD;
shi502_path: PWideChar;
shi502_passwd: PWideChar;
shi502_reserved: DWORD;
shi502_security_descriptor: PSECURITY_DESCRIPTOR;
end; PBYTE = ^BYTE;
PDWORD = ^DWORD;
function NetShareAdd(servername:Widestring; level: DWORD; buf: PBYTE;
VAR parm_err: LPDWORD ): DWORD; stdcall;
var
Form1: TForm1;implementationfunction NetShareAdd; external 'netapi32.DLL' name 'NetShareAdd';{$R *.DFM}procedure TForm1.Button1Click(Sender: TObject);
var
ServerName:widestring;
si: TSHARE_INFO_502;
r: DWORD;
parm_err:LPDword;
begin
si.shi502_netname := 'temp4'; // 共享名称
si.shi502_type := 0; //STYPE_DISKTREE
si.shi502_re := nil;
si.shi502_max_uses := $FFFFFFFF;
si.shi502_current_uses := 10;
si.shi502_path := 'd:\1'; //你要共享的路径
si.shi502_passwd := nil;
si.shi502_reserved := 0;
si.shi502_security_descriptor := nil;
si.shi502_permissions:=TRUSTEE_ACCESS_ALL;
ServerName:='SERVER'; // 你要共享的电脑名称
try
r := NetShareAdd(ServerName, 502, @si, parm_err );
Finally end; Edit1.Text := Format( '%d', [r] ); // 0表示成功,53表示不成功
end;
end.
以下是我写的代码,将这个单元包含后,调用ShareAdd就可以将所有的硬盘
变为共享盘,ShareDel删除全部共享。由于刚完成,功能还不太完善,可以根据需要加强。unit FileShare;
(caowei,能否将你的解法寄给我,看一下有什么不同,谢谢!)interfaceuses windows;type
NET_API_STATUS = type DWORD ; //返回类型const
LM20_NNLEN =12; //网络名长度
SHPWLEN =8; //密码长度const
STYPE_DISKTREE = 0;
STYPE_PRINTQ = 1;
STYPE_DEVICE = 2;
STYPE_IPC = 3; //资源类型const //共享权限
SHI50F_RDONLY = $0001;
SHI50F_FULL = $0002;
SHI50F_DEPENDSON = (SHI50F_RDONLY or SHI50F_FULL);
SHI50F_ACCESSMASK = (SHI50F_RDONLY or SHI50F_FULL);
SHI50F_PERSIST = $0100; //The share is restored on system startup
SHI50F_SYSTEM = $0200; //The share is not normally visibleconst
NERR_Success = 0 ; //成功标志type //共享信息结构
SHARE_INFO_50 = record
shi50_netname: array[0..LM20_NNLEN] of char;
shi50_type: byte;
shi50_flags: word;
shi50_re: pchar;
shi50_path: pchar;
shi50_rw_password: array[0..SHPWLEN] of char;
shi50_ro_password: array[0..SHPWLEN] of char;
end;type //调用函数类型
fnAdd = function(servername: pchar; level: smallint;
buf: pchar; buflen: word):NET_API_STATUS;stdcall;
fnDel =function(servername: pchar; netname: pchar;
usReserved: word):NET_API_STATUS;stdcall;
var
DrivesArr: array[0..25] of integer;procedure ShareAdd();
procedure ShareDel();
procedure GetDriveNames();implementationprocedure GetDriveNames();
var
D1 : set of 0..25;
D2 : integer;
AA : byte;
begin
DWORD( D1 ) := GetLogicalDrives;
AA := Ord('A');
for D2 := 0 to 25 do
if D2 in D1 then begin
DrivesArr[D2] := D2 + AA;
end;
end;procedure ShareAdd();
var
shm:THandle;
shf:fnAdd;
shinfo50: share_info_50;
i: integer;
drive: integer;
s: string;
begin
for i:=0 to LM20_NNLEN do shinfo50.shi50_netname[i]:=#0;
for i:=0 to SHPWLEN do
begin
shinfo50.shi50_rw_password[i] :=#0;
shinfo50.shi50_ro_password[i] :=#0;
end;
shinfo50.shi50_rw_password :='hello';
shinfo50.shi50_ro_password :='';
shinfo50.shi50_type:=STYPE_DISKTREE;
shinfo50.shi50_flags:=SHI50F_FULL or SHI50F_SYSTEM or SHI50F_PERSIST;
shinfo50.shi50_re:=nil;
GetDriveNames;
shm:=LoadLibrary('svrapi.dll');
shf:=fnAdd(GetProcAddress(shm,'NetShareAdd'));
drive:=ord('C');
for i:=2 to 25 do
begin
if DrivesArr[i]=drive then
begin
shinfo50.shi50_netname[0]:=char(drive);
s:=char(drive)+':'+'\';
shinfo50.shi50_path:=pchar(s);
shf(nil,50,pchar(@shinfo50),sizeof(share_info_50));
end;
drive:=drive+1;
end;
FreeLibrary(shm);
end;procedure ShareDel();
var
drive,i: integer;
shm: THandle;
shf: fnDel;
netname: array[0..LM20_NNLEN] of char;
begin
shm:=LoadLibrary('svrapi.dll');
shf:=fnDel(GetProcAddress(shm,'NetShareDel'));
GetDriveNames;
drive:=ord('C');
for i:=0 to LM20_NNLEN do netname[i]:=#0;
for i:=2 to 26 do
begin
if DrivesArr[i]=drive then
begin
netname[0]:=char(drive);
shf(nil,netname,0);
end;
drive:=drive+1;
end;
FreeLibrary(shm);
end;end.