请问,有谁知道怎样使用网络资源共享函数 NetShareAdd(servername:lpstr;level:DWORD;buf:PBYTE;pam_err:LPDWORD);?????????????
在Delphi中.
在Delphi中.
解决方案 »
- 百分求翻译一条c为delphi(跨域)
- 写一个软件 在自己电脑上能用 在网吧有的功能实现不了
- blazingfire近来接分1(如何在内存中直接打开Word文档?)
- *********正投简历呢,看到一家公司招聘没给笑死,招精通精通Java、C++、VC++、C#的工程师,月薪1500
- 能不能在拖动DBGIRD的列的时候,让一个EDIT或者LABEL控件跟着列的宽度变化?高手帮忙
- 100分求计算器源代码!
- 高分求一个例程
- RichEdit怎样实现多次Undo
- 高分请问:######### 怎样监控IE的地址栏的地址信息。
- 程序中调用另外一个已经装入内存中的可执行文件
- 应用程序和编译成DLL方式的区别?
- 数据库图片插入问题
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
_SHARE_INFO_2 = packed record
shi2_netname: PWideChar;
shi2_type: LongWord;
shi2_re: PWideChar;
shi2_permissions: LongWord;
shi2_max_uses: LongWord;
shi2_current_uses: LongWord;
shi2_path: PWideChar;
shi2_passwd: PWideChar;
end; PSHARE_INFO_2 = ^_SHARE_INFO_2; TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end; function NetShareAdd(ServerName: PWideChar; Level: LongWord; buf: PByte; parm_err: PLongWord): integer; stdcall; external 'Netapi32.dll' name 'NetShareAdd';const
STYPE_DISKTREE = 0;
var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
var
res: LongWord;
p: _SHARE_INFO_2;
parm_err: LongWord;
s1, s2, s3: WideString;
ret: Integer;
begin
parm_err := 0;
s1 := 'ShareTest';
p.shi2_netname := PWideChar(s1);
p.shi2_type := STYPE_DISKTREE;
s2 := 'TESTSHARE to test NetShareAdd';
p.shi2_re := PWideChar(s2);
p.shi2_permissions := 0;
p.shi2_max_uses := 4;
p.shi2_current_uses := 0;
s3 := 'F:\\Setup\\';
p.shi2_path := PWideChar(s3);
p.shi2_passwd := nil;
ret := NetShareAdd(nil, 2, PByte(@p), @Parm_err);
if ret = 0 then
ShowMessage('操作成功!');
else
ShowMessage(IntToStr(ret)+':'+IntToStr(parm_err));
end;end.
ShowMessage('操作成功!');
else
ShowMessage(IntToStr(ret)+':'+IntToStr(parm_err));
//上面不是有返回值吗?你看一下返回值是什么,然后再查一下API的说明吧:parm_errOptional pointer to a DWORD that contains the index of the first parameter that causes ERROR_INVALID_PARAMETER. If NULL, the parameter is not returned on error.
ShowMessage('操作成功!');
else
ShowMessage(IntToStr(ret)+':'+IntToStr(parm_err));
//上面不是有返回值吗?你看一下返回值是什么,然后再查一下API的说明吧:parm_errOptional pointer to a DWORD that contains the index of the first parameter that causes ERROR_INVALID_PARAMETER. If NULL, the parameter is not returned on error.
s3 := 'F:\\Setup\\';要写成s3 := 'F:\Setup\';
const
STYPE_DISKTREE = 0;
改成const
STYPE_DISKTREE = 3;
试一下吧??
STYPE_DEVICE STYPE_IPC 在哪可以找它们的值?????????
STYPE_PRINTQ Print queue
STYPE_DEVICE Communication device
STYPE_IPC Interprocess communication (IPC)
STYPE_SPECIAL Special share reserved for interprocess communication (IPC$) or
remote administration of the server (ADMIN$). Can also refer to
administrative shares such as C$, D$, E$, and so forth. For more
information, see the network management share functions.
STYPE_DISKTREE = 0;
STYPE_PRINTQ = 1;
STYPE_DEVICE = 2;
STYPE_IPC = 3;
STYPE_SPECIAL = ?
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls,FileCtrl,My_Share;
type
TFormShare = class(TForm)
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
BtSelect: TButton;
EditDir: TEdit;//文件共享目录
EditSharename: TEdit; //共享名称
EditInfo: TEdit;//备注
Button1: TButton;
Button2: TButton;
procedure BtSelectClick(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
FormShare: TFormShare;
implementation{$R *.DFM}
procedure TFormShare.BtSelectClick(Sender: TObject);
var
directory: string;
begin
if SelectDirectory('选择一个目录','', directory) then
EditDir.Text := directory;
end;procedure TFormShare.Button1Click(Sender: TObject);
begin
if EditDir.Text = '' then
begin
Application.MessageBox('请先选择一个目录!', '共享', MB_ICONINFORMATION + MB_OK);
BtSelect.Click;
Exit;
end;
if EditSharename.Text = '' then
begin
Application.MessageBox('请先输入共享名称!', '共享', MB_ICONINFORMATION + MB_OK);
EditSharename.SetFocus;
Exit;
end;
ShareResource('eengi',EditDir.Text,EditSharename.Text,EditInfo.Text);
{注意:如果在共享目录名称后面添加 $ 符号,共享后在网络邻居里看不到此文件夹但实际上已经共享了,你可以在本地看到}
end;
end.以下是单元文件:
unit My_Share;
interface
uses
Windows,Sysutils ;
type
//纪录类型声明,注意参数类型的正确对应,最好别看 delphi 的帮助,引起误导
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;
//添加共享
function NetShareAdd(servername:Widestring; level: DWORD; Buf: PBYTE;
var parm_err: PDWORD ): DWORD; stdcall;
//删除共享
function NetShareDel(ServerName:Widestring; NetName: Widestring;
Reserved: DWord): Integer; StdCall;
const
{共享类型}
STYPE_DISKTREE = 0 ;
STYPE_PRINTQ = 1 ;
STYPE_DEVICE = 2 ;
STYPE_IPC = 3 ;
{访问权限}
ACCESS_READ = 0 ;
ACCESS_WRITE = 1 ;
ACCESS_CREATE = 2 ;
ACCESS_EXEC = 3 ;
ACCESS_DELETE = 4 ;
ACCESS_ALL = 7 ;//自己声明的函数,为了调用方便,参数就不用说明了吧!
function ShareResource(ServerName,FilePath,NetName, Re : string): Integer;
//function DeleteShare(ServerName: string; NetName: string): Integer;
implementation
//注意在 windows95/98/me 下面 dll 库是 SVRAPI.DLL ,而且参数类型也要随之改变的吆!
function NetShareAdd; external 'netapi32.DLL' name 'NetShareAdd';
function NetShareDel; external 'netapi32.DLL' name 'NetShareDel';function ShareResource(ServerName,FilePath,NetName, Re : string): Integer;var
ShInfo: TSHARE_INFO_502;
parm_err:PDWORD;
_FilePath,_NetName, _Re : PWideChar ;
_ServerName : Pchar ;
begin
GetMem(_ServerName,255) ; //分配内存
GetMem(_FilePath,255);
GetMem(_NetName,255);
GetMem(_Re,255);
StringToWideChar(FilePath,_FilePath,255); //字符串转换,一定要转换正确
StringToWideChar(NetName,_NetName,255);
StringToWideChar(Re,_Re,255);
strpcopy(_ServerName,ServerName);
//开始创建结构
with ShInfo do
begin
shi502_netname := _NetName;
shi502_type := STYPE_DISKTREE ;
shi502_re := _Re ;
shi502_max_uses := $FFFFFFFF;
shi502_current_uses := 10;
shi502_path := _FilePath;
shi502_passwd := nil;
shi502_reserved := 0;
shi502_security_descriptor := nil;
shi502_permissions := ACCESS_ALL;
end;
try
Result := NetShareAdd(_ServerName, 502, @ShInfo, parm_err);
Finally // 别忘了释放内存
FreeMem(_ServerName,255);
FreeMem(_FilePath,255);
FreeMem(_NetName,255);
FreeMem(_Re,255);
end;
end;
end.