源代码:http://down3.tomore.com/down/datanew/2004082821132928529.zip我的操作系统是在C:,Windows XP sp2。程序可以设置系统盘以外的目录为共享,并在其他电脑上可以访问。
但当要共享的目录在系统盘(C:)时,即使用程序设置了共享,在网络邻居里仍无法访问。请问这是什么原因

解决方案 »

  1.   

    unit PShare;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls,My_Share;type
      TFormShare = class(TForm)
        Label1: TLabel;
        Label2: TLabel;
        Label3: TLabel;
        EditDir: TEdit;//文件共享目录
        EditSharename: TEdit; //共享名称
        EditInfo: TEdit;//备注
        Button1: TButton;
        btn1: TButton;
        btn2: TButton;
        procedure Button1Click(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure btn1Click(Sender: TObject);
        procedure btn2Click(Sender: TObject);
      private
        { Private declarations }
        procedure ssssss;
      public
        { Public declarations }
      end;var
      FormShare: TFormShare;implementationuses
      UntSysInfo, UntFileAccessRights;{$R *.DFM}
     
    procedure TFormShare.Button1Click(Sender: TObject);
    begin
      if EditDir.Text = '' then
        begin
          Application.MessageBox('请先输入一个目录!', '共享', MB_ICONINFORMATION + MB_OK);
          EditDir.SetFocus;
          Exit;
        end;
      if EditSharename.Text = '' then
        begin
          Application.MessageBox('请先输入共享名称!', '共享', MB_ICONINFORMATION + MB_OK);
          EditSharename.SetFocus;
          Exit;
        end;
      ShareResource('',EditDir.Text,EditSharename.Text,EditInfo.Text);
      {注意:如果在共享目录名称后面添加 $ 符号,共享后在网络邻居里看不到此文件夹
       但实际上已经共享了,你可以在本地看到}
    end;
     
    procedure TFormShare.FormCreate(Sender: TObject);
    begin
    //直接得到的目录后边有“\”号,如果为要目录则保留,否则处理掉。
    //同时,设置共享名称为目录名,为要目录则设为驱动器名  editdir.text := ExtractFilePath(ParamStr(0));
      if length(editdir.text)>3 then
        begin
          editdir.text := copy(Editdir.text,1,length(Editdir.text)-1);
          editsharename.Text:=editdir.text;
          while pos('\',editsharename.Text)<>0 do
            editsharename.text := copy (editsharename.text,pos('\',editsharename.text)+1,length(editsharename.text)-pos('\',editsharename.text));
        end
      else
        begin
          editsharename.text:=copy(editdir.text,1,1);
        end;
    end;procedure TFormShare.btn1Click(Sender: TObject);
    begin
      DeleteShare('',EditSharename.Text);
    end;end.================================================unit My_Share;
     
    interfaceuses
       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;function DeleteShare(ServerName: string; NetName: string): Integer;
    begin
      NetShareDel(ServerName,NetName,0);
    end;end.