请问,有谁知道怎样使用网络资源共享函数 NetShareAdd(servername:lpstr;level:DWORD;buf:PBYTE;pam_err:LPDWORD);?????????????
在Delphi中.

解决方案 »

  1.   

    我试了一下不行,一起看看有什么错误!
    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.
      

  2.   

    if ret = 0 then
        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.
      

  3.   

    if ret = 0 then
        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.
      

  4.   

    查不了,在WINDOWS.PAS单元里找不到类似ERROR_INVALID_PARAMETER的值.
      

  5.   

    操作成功了.
    s3 := 'F:\\Setup\\';要写成s3 := 'F:\Setup\';
      

  6.   

    牛人!这也找出来了,我试使。可MSDN说明是要双斜杠。
      

  7.   

    还有一个,
    const
      STYPE_DISKTREE = 0;
    改成const
      STYPE_DISKTREE = 3;
    试一下吧??
      

  8.   

    双斜扛是对于C++而言的。delphi只需\
      

  9.   

    STYPE_DISKTREE STYPE_PRINTQ
    STYPE_DEVICE STYPE_IPC  在哪可以找它们的值?????????
      

  10.   

    不对吧 3的意思是Interprocess communication (IPC)STYPE_DISKTREE  Disk drive 
    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. 
      

  11.   

    const
    STYPE_DISKTREE  = 0;
    STYPE_PRINTQ     = 1;
    STYPE_DEVICE    = 2; 
    STYPE_IPC       = 3;
    STYPE_SPECIAL   = ?
      

  12.   

    unit Share; 
    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.