150分换一个“NT下共享目录的设置、删除”(150分)

  • 主题发起人 主题发起人 lonelyyekai
  • 开始时间 开始时间
L

lonelyyekai

Unregistered / Unconfirmed
GUEST, unregistred user!
我是个Delphi的新人,各位大侠,帮帮忙喽
我已经阅读了本论坛的相关文章,知道已有人解决了此问题(“NT下共享目录的设置、删除”

但是具体的解答没提供
若哪位有现成的控件可发给我(lybupt@263.net)
或者把源码发布在此也成(是NT下的,不是WIN9x的;是Delphi的,不是C的)。
因为活比较急,下周一要见雏形,所以望高人们能在三天内给我一个解答
我感激不尽
 
对共享目录要设置些什么?删除些什么?
是不是对某个目录设为共享或删除共享啊?
你得说清楚一些啊,你不说清楚我怎么知道你想要什么呢?
 
关于nt的共享目录的删除和设置,你可以参见以下一些注册表键值:
HKEY_LOCAL_MACHINE/SYSTEM/ControlSet001/Services/LanmanServer/Shares/*.*
HKEY_LOCAL_MACHINE/SYSTEM/ControlSet001/Services/LanmanServer/Shares/Security/*.*

HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/LanmanServer/Shares/*.*
HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/LanmanServer/Shares/Security/*.*
你按照nt的规律编个读写注册表的程序就ok了。

 
就是要通过Delphi的程序实现将任意一目录设置成局域网内的共享目录
至于该设置些什么,我想大家对此应不陌生
例如,设置此共享目录为读取、或完全控制、或可写、等等。
我在本论坛上见过不少人讨论,知道用NetShareAdd函数可以实现
但是那是API(用C写的),尤其是那个结构体参数,要转化为Delphi我觉得很难
所以在此求助,希望能找到现成的控件或源码
如果哪位大侠能抽出宝贵时间为我写出这段Delphi的源代码(包括添加,删除共享)
我感激不尽!!!!!!!!!!!
鞠躬先!
至于说修改注册表之类的,我想大概不用吧,不然我还得再发一篇如何修改注册表了(我
可是个新手啊)
 
结构体参数也不是很难啊
typedef struct _SHARE_INFO_2 {
LPWSTR shi2_netname;
DWORD shi2_type;
LPWSTR shi2_remark;
DWORD shi2_permissions;
DWORD shi2_max_uses;
DWORD shi2_current_uses;
LPWSTR shi2_path;
LPWSTR shi2_passwd;
} SHARE_INFO_2

自己仿照这个结构体自己定义一个啦。
LPWSTR换成pchar,DWORD换成Longint

怎么用就看msdn了,又例子。
 
各位大侠,小弟照葫芦画瓢,用了这个函数后,本机上目录的共享设置以没有问题了,但现在地问题
是我需要能够设置同一域内其他机器的共享目录(网上邻居中能看见),我看了NetShareAdd
的帮助,第一个参数应该就是说需要设置共享目录的机器的机器名,但我试了后不成功,现在
把程序附在下面,请各位给找找问题:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls,AccCtrl;

type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Edit2: TEdit;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

TSHARE_INFO_502 = record
shi502_netname: PWideChar;
shi502_type: DWORD;
shi502_remark: 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:PChar; level: DWORD; buf: PBYTE;
parm_err: PDWORD ): DWORD; stdcall;

var
Form1: TForm1;

implementation

function NetShareAdd; external 'netapi32.DLL' name 'NetShareAdd';

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var
ServerName:pchar;
si: TSHARE_INFO_502;
r: DWORD;
parm_err:PDword;
begin
si.shi502_netname := 'temp4'; (共享名)
si.shi502_type := 0; //STYPE_DISKTREE
si.shi502_remark := nil;
si.shi502_max_uses := $FFFFFFFF;
si.shi502_current_uses := 10;
si.shi502_path := 'f:/sango3'; (原路径)
si.shi502_passwd := nil;
si.shi502_reserved := 0;
si.shi502_security_descriptor := nil;
si.shi502_permissions:=TRUSTEE_ACCESS_ALL;
ServerName:=stralloc(200);
strpcopy(ServerName,'vodserver'); ('vodserver'是机器名)
try
r := NetShareAdd(ServerName, 502, @si, parm_err );
Finally
strdispose(ServerName);
end;
Edit1.Text := Format( '%d', [r] );
Edit2.Text:=inttostr(parm_err);
end;

end.

NetShareAdd的返回值老是53,不知道是什么意思,也找不到相应的错误意义
高手们多帮忙,原本说今天要搞定的,跟老板又拖了拖,说是周一,请大家在这两天内无论如何
帮我想想办法啊!!!

多谢多谢!
 
是不是权限问题啊?比如你想共享nt的目录,而没有相应的权限
 
再看一下函数的返回值吧。
ERROR_ACCESS_DENIED The user does not have access to the requested information.
ERROR_INVALID_LEVEL The value specified for the level parameter is invalid.
ERROR_INVALID_NAME The character or file system name is invalid.
ERROR_INVALID_PARAMETER The specified parameter is invalid.
NERR_DuplicateShare The share name is already in use on this server.
NERR_RedirectedPath The operation is invalid for a redirected resource. The specified device name is assigned to a shared resource.
NERR_UnknownDevDir The device or directory does not exist.
 
To Lww:
谢谢你,不过我有这个权限。我试了用管理工具里的管理向导来在另一机上(同一域里
的)建立一个新目录,并设置共享已成功!!
--------------------------------------
各位大侠给看看吧
我用另外一个ID又问了同样的问题
谁替我回答这个问题
小弟感激不尽
恭敬献上350大洋(另外一处有200)
拜托了,已经很久了,我在这一两天内一定要解决啊
现在我简直就是热锅上的蚂蚁
高手们,亮绝招吧!!!!!!!!!
 
那个问题的号码是多少?
找不到!!!
 
问题已经解决,(350分真好赚 :-))

答案如下:

function NetShareAdd(servername:Widestring; level: DWORD; buf: PBYTE;
VAR parm_err: LPDWORD ): DWORD; stdcall;

var
ServerName:widestring;

.....
ServerName:='MyserverName';

即可,也就是说,问题出在要把参数声明为WideString,
其实你只要好好看一下Win32Help就可以节省下这350分了。
(另外parm_err参数如上面也改为LPDWORD比较好)
 
现在连我自己都不禁有点觉得这分送的太容易了!!
哎。。。。
不过没说的,你确实替我解决了一大难题!!!!!!
实话说,我对C实在头大,Delphi也不过是刚入门,所以很多问题都只能请教“专家”。
所谓重赏之下必有勇夫,原先这个问题也放这快一周了,还是每人能正确解答
现在加200分,一天之内就解决了
多谢你替我解决了这个问题,分我一定送上(先送200,150随后到)
希望你拿到分时,再顺便说一下
为什么Lptstr和widestring更匹配,而不是pchar
Lptstr不是以0结尾的字符串吗????????
 
忘了说了,Delphi里没有Lpdword啊,是不是也得变啊????
 
1.这个API需要Unicode string,因此要WideString,LPTSTR的定义是什么我看不到,
你可以查一下,其他API如果没有说明,仍然可以用PChar。

2.Delphi5 中有LPDWORD呀?就在我。windows.pas里,实际上不用也可以,因为
LPDWORD=PDWORD,PDWORD=^DWORD。
 
温柔一刀:
这几天不能上网,所以送分送晚了,别见怪啊!
来分喽!
 

Similar threads

回复
0
查看
816
不得闲
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
887
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部