線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2120
推到 Plurk!
推到 Facebook!

如何用程式將資料夾變更成網路共享資料夾

尚未結案
leobxb
一般會員


發表:18
回覆:30
積分:14
註冊:2003-10-02

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-09-15 09:44:30 IP:220.229.xxx.xxx 未訂閱
我有兩個問題 1.如何用程式將資料夾變更成網路共享資料夾 2.如何知道目前資料夾為一般資料夾或網路共享資料夾 有收穫記得回饋,讓我們台灣跨出程式的出頭天...
RickyHe
一般會員


發表:0
回覆:1
積分:0
註冊:2004-09-02

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-09-16 09:42:39 IP:210.21.xxx.xxx 未訂閱
用下面的代码 typedef DWORD (WINAPI *NETSHAREADD2K)(LPWSTR, DWORD, LPBYTE, LPDWORD); typedef DWORD (WINAPI *NETSHAREADD9X)(const char FAR*, short, const char FAR*, unsigned short); NETSHAREADD2K NetShareAdd2k; NETSHAREADD9X NetShareAdd9x; bool bWinNT; // 操作系统标志 HINSTANCE hDll; // DLL文件句柄 #define NNLEN 80 // 共享名的长度 #define LM20_NNLEN 12 // LM 2.0 共享名的长度 #define SHPWLEN 8 // 共享密码的长度 #define STYPE_DISKTREE 0 // 磁盘共享 #define SHI50F_FULL 0x0002 #define NERR_Success 0 // 操作成功 #define NERR_BASE 2100 #define NERR_DuplicateShare (NERR_BASE 18) // 共享名称已经存在 #define NERR_RedirectedPath (NERR_BASE 17) // 重定向资源的操作非法 #define NERR_UnknownDevDir (NERR_BASE 16) // 设备或目录不存在 typedef struct _share_info_50 // 用于Win9x { char shi50_netname[LM20_NNLEN 1]; // 共享名 unsigned char shi50_type; // unsigned short shi50_flags; // char FAR * shi50_remark; // ANSI 备注 char FAR * shi50_path; // 共享的资源,也就是共享的目录 char shi50_rw_password[SHPWLEN 1]; // 可读写的密码 char shi50_ro_password[SHPWLEN 1]; // 只读密码 }share_info_50; typedef struct _SHARE_INFO_2 // 用于Win2k { 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, *PSHARE_INFO_2, *LPSHARE_INFO_2; //--------------------------------------------------------------------------- bool __fastcall InitApi() // 根据操作系统的不同,从Dll中获取API { // 判断系统平台 OSVERSIONINFO info; info.dwOSVersionInfoSize = sizeof(info); GetVersionEx(&info); bWinNT = (info.dwPlatformId == VER_PLATFORM_WIN32_NT) ? true: false; if(bWinNT) { hDll = LoadLibrary("Netapi32.dll"); // win2k if(hDll) { NetShareAdd2k = (NETSHAREADD2K)GetProcAddress(hDll, "NetShareAdd"); return (NetShareAdd2k != NULL); } else return false; } else { hDll = LoadLibrary("Svrapi.dll"); // win9x if(hDll) { NetShareAdd9x = (NETSHAREADD9X)GetProcAddress(hDll, "NetShareAdd"); return NetShareAdd9x != NULL; } else return false; } } //--------------------------------------------------------------------------- String __fastcall MyPathToNetShare( String strPath, // 共享目录 String strNetName, // 共享名 String strPassword, // 密码 String strRemark) // 共享目录的注释 { if(!InitApi()) return "函数获取错误!"; // 文档标题:如何在Win9x/2k下建立共享目录 if(!bWinNT) // 操作系统是win9x { char FAR *pszServerName = NULL; short nLevel = 50; // struct share_info_50 * pBuf = NULL; share_info_50 * pBuf = NULL; unsigned short cbBuffer; DWORD nStatus; //cbBuffer = sizeof(struct share_info_50); cbBuffer = sizeof(share_info_50); pBuf = (share_info_50 *)malloc(cbBuffer); if(pBuf == NULL) return "内存分配失败!"; // Assign values to the share_info_50 structure. strcpy(pBuf->shi50_netname, strNetName.c_str()); pBuf->shi50_type = STYPE_DISKTREE; pBuf->shi50_flags = SHI50F_FULL; pBuf->shi50_remark = strRemark.c_str(); pBuf->shi50_path = strPath.c_str(); strcpy(pBuf->shi50_rw_password, strPassword.c_str()); // No password strcpy(pBuf->shi50_ro_password, strPassword.c_str()); // No password // Call the NetShareAdd function specifying information level 50. nStatus = NetShareAdd9x(pszServerName, nLevel, (char FAR *)pBuf, cbBuffer); // 释放分配的内存 if(pBuf != NULL) free(pBuf); // FreeLibrary(hDll); if(nStatus == NERR_Success) return("添加成功!"); else return String("有错误发生,返回码: " String(nStatus)); } else // 操作系统是Win2k { HANDLE hToken; TOKEN_PRIVILEGES tk; // 首先提升本进程的调试级别 OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken); LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tk.Privileges[0].Luid); tk.PrivilegeCount = 1; tk.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; AdjustTokenPrivileges(hToken, FALSE, &tk, 0, (PTOKEN_PRIVILEGES)NULL, 0); DWORD nas; SHARE_INFO_2 p; DWORD dwParamErr = NULL; p.shi2_path = StringToOleStr(strPath); p.shi2_remark = StringToOleStr(strRemark); p.shi2_netname = StringToOleStr(strNetName); p.shi2_passwd = StringToOleStr(strPassword); p.shi2_type = STYPE_DISKTREE; // disk drive p.shi2_permissions = 0; p.shi2_max_uses = -1; p.shi2_current_uses = 0; nas = NetShareAdd2k(NULL, 2, (LPBYTE)&p, &dwParamErr); FreeLibrary(hDll); switch(nas) { case NERR_Success: return "设置成功!"; case ERROR_ACCESS_DENIED: return "拒绝访问!"; case ERROR_INVALID_LEVEL: return "非法的级别!"; case ERROR_INVALID_NAME: return "非法的名称!"; case ERROR_INVALID_PARAMETER: return "参数非法!"; case NERR_DuplicateShare: return "共享重名!"; case NERR_RedirectedPath: return "重定向路径!"; case NERR_UnknownDevDir: return "未知的驱动路径!"; default: return "未知错误!"; } } } /* // 调用举例 //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { ShowMessage(MyPathToNetShare("C:\\ccrun\\123", "MyShare", "", "共享目录的注释")); } //--------------------------------------------------------------------------- */
leobxb
一般會員


發表:18
回覆:30
積分:14
註冊:2003-10-02

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-09-16 16:13:10 IP:220.229.xxx.xxx 未訂閱
我試了這個程式,但是用別台電腦的網路芳鄰可以看到剛剛設定的目錄, 要進入時卻顯示"無法存取 \\leo\test。存取被拒"的錯誤訊息.這時 我再用檔案總管看看我設定的資料夾,發現並沒有變成一隻手拿著資料夾 的圖示,但點選內容進去看時,卻有設定成共享了.這時我重開機,發現有 變成一隻手拿著資料夾的圖示,但別台電腦還是進不去啊?為什麼呢??? 有收穫記得回饋,讓我們台灣跨出程式的出頭天...
andychang1690
資深會員


發表:20
回覆:694
積分:442
註冊:2003-03-14

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-09-17 01:46:56 IP:221.169.xxx.xxx 未訂閱
leobxb:RickyHe給妳的為來自對岸
// 文檔標題:如何在Win9x/2k下建立共用目錄
// 作者:ccrun(老妖) 信箱:info@ccrun.com
// 歡迎訪問C  Builder 研究 http://www.ccrun.com
我執行並沒有問題,我是Win-XP-Professional,BCB6。
包括妳所謂一隻手拿著資料夾的圖示問題(最多重開檔案總管)。
因為RickyHe引用為簡體,我把整個程式重新Post上來,
整個Form上只要放一個Button即可。
Unit1.cpp
//---------------------------------------------------------------------------
#include 
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
typedef DWORD (WINAPI *NETSHAREADD2K)(LPWSTR, DWORD, LPBYTE, LPDWORD);
typedef DWORD (WINAPI *NETSHAREADD9X)(const char FAR*, short, const char FAR*, unsigned short);
NETSHAREADD2K NetShareAdd2k;
NETSHAREADD9X NetShareAdd9x;
bool bWinNT; // 作業系統標誌
HINSTANCE hDll; // DLL文件控制碼
#define NNLEN 80 // 共用名稱的長度
#define LM20_NNLEN 12 // LM 2.0 共用名稱的長度
#define SHPWLEN 8 // 共用密碼的長度
#define STYPE_DISKTREE 0 // 磁片共用
#define SHI50F_FULL 0x0002
#define NERR_Success 0 // 操作成功
#define NERR_BASE 2100
#define NERR_DuplicateShare (NERR_BASE 18) // 共用名稱稱已經存在
#define NERR_RedirectedPath (NERR_BASE 17) // 重定向資源的操作非法
#define NERR_UnknownDevDir (NERR_BASE 16)  // 設備或目錄不存在
typedef struct _share_info_50  // 用於Win9x
{
  char shi50_netname[LM20_NNLEN 1];// 共用名稱
  unsigned char shi50_type;//
  unsigned short shi50_flags;// 
  char FAR *shi50_remark;// ANSI 備註
  char FAR *shi50_path;// 共用的資源,也就是共用的目錄
  char shi50_rw_password[SHPWLEN 1]; // 可讀寫的密碼
  char shi50_ro_password[SHPWLEN 1]; // 唯讀密碼
}share_info_50;    typedef struct _SHARE_INFO_2 // 用於Win2k
{
  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, *PSHARE_INFO_2, *LPSHARE_INFO_2;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
  : TForm(Owner)
{
}
//---------------------------------------------------------------------------
bool __fastcall InitApi() // 根據作業系統的不同,從Dll中獲取API
{
  // 判斷系統平臺
  OSVERSIONINFO info;
  info.dwOSVersionInfoSize = sizeof(info);
  GetVersionEx(&info);
  bWinNT = (info.dwPlatformId == VER_PLATFORM_WIN32_NT)? true: false;
  if(bWinNT) {
    hDll = LoadLibrary("Netapi32.dll"); // win2k
    if(hDll) {
      NetShareAdd2k = (NETSHAREADD2K)GetProcAddress(hDll, "NetShareAdd");
      return (NetShareAdd2k != NULL);
    }
    else
      return false;
  }
  else {
    hDll = LoadLibrary("Svrapi.dll"); // win9x
    if(hDll) {
      NetShareAdd9x = (NETSHAREADD9X)GetProcAddress(hDll, "NetShareAdd");
      return NetShareAdd9x != NULL;
    }
    else
      return false;
  }
}
//---------------------------------------------------------------------------
String __fastcall MyPathToNetShare(
        String strPath,  // 共用目錄
        String strNetName,  // 共用名稱
        String strPassword,  // 密碼
        String strRemark )  // 共用目錄的注釋
{
  if(!InitApi())
    return "函數獲取錯誤!";
  // 文檔標題:如何在Win9x/2k下建立共用目錄
  // 作者:ccrun(老妖) 信箱:info@ccrun.com
  // 為防止不負責任的轉載者遺漏作者資訊,故在此插入此資訊,請見諒.
  // 歡迎訪問C  Builder 研究 http://www.ccrun.com
  if(!bWinNT) {  // 作業系統是win9x
    char FAR *pszServerName = NULL;
    short nLevel = 50;
//    struct share_info_50* pBuf = NULL;
    share_info_50 * pBuf = NULL;
    unsigned short cbBuffer;
    DWORD nStatus;
    cbBuffer = sizeof(share_info_50);
    pBuf = (share_info_50 *)malloc(cbBuffer);
    if(pBuf == NULL)
      return "記憶體分配失敗!";
    // Assign values to the share_info_50 structure.
    strcpy(pBuf->shi50_netname, strNetName.c_str());
    pBuf->shi50_type = STYPE_DISKTREE;
    pBuf->shi50_flags = SHI50F_FULL;
    pBuf->shi50_remark = strRemark.c_str();
    pBuf->shi50_path = strPath.c_str();
    strcpy(pBuf->shi50_rw_password, strPassword.c_str()); // No password
    strcpy(pBuf->shi50_ro_password, strPassword.c_str()); // No password
    // Call the NetShareAdd function specifying information level 50.
    nStatus = NetShareAdd9x(pszServerName,
              nLevel,
              (char FAR *)pBuf,
              cbBuffer);
    // 釋放分配的記憶體
    if(pBuf != NULL)
      free(pBuf);
    FreeLibrary(hDll);
    if(nStatus == NERR_Success)
      return("添加成功!");
    else
      return String("有錯誤發生,返回碼:" String(nStatus));
  }
  else {  // 作業系統是Win2k
    HANDLE hToken;
    TOKEN_PRIVILEGES tk;
    // 首先提升本進程的調試級別
    OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);
    LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tk.Privileges[0].Luid);
    tk.PrivilegeCount = 1;
    tk.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    AdjustTokenPrivileges(hToken, FALSE, &tk, 0, (PTOKEN_PRIVILEGES)NULL, 0);
    DWORD nas;
    SHARE_INFO_2 p;
    DWORD dwParamErr = NULL;
    p.shi2_path= StringToOleStr(strPath);
    p.shi2_remark= StringToOleStr(strRemark);
    p.shi2_netname= StringToOleStr(strNetName);
    p.shi2_passwd= StringToOleStr(strPassword);
    p.shi2_type= STYPE_DISKTREE; // disk drive
    p.shi2_permissions= 0;
    p.shi2_max_uses= -1;
    p.shi2_current_uses= 0;
    nas = NetShareAdd2k(NULL, 2, (LPBYTE)&p, &dwParamErr);
                FreeLibrary(hDll);
    switch(nas) {
      case NERR_Success:return "設置成功!";
      case ERROR_ACCESS_DENIED:return "拒絕訪問!";
      case ERROR_INVALID_LEVEL:return "非法的級別!";
      case ERROR_INVALID_NAME:return "非法的名稱!";
      case ERROR_INVALID_PARAMETER:return "參數非法!";
      case NERR_DuplicateShare:return "共用重名!";
      case NERR_RedirectedPath:return "重定向路徑!";
      case NERR_UnknownDevDir:return "未知的驅動路徑!";
      default:return "未知錯誤!";
    }
  }
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  // 調用舉例
  ShowMessage(MyPathToNetShare("D:\\USB", "USB","" ,"共用目錄的注釋"));
}
//---------------------------------------------------------------------------
另外給妳其他的參考
http://delphi.ktop.com.tw/topic.php?topic_id=26472
【BCB】【轉貼】建立和刪除共享文件夾 
請參考!    
Andy Chang 發表人 - andychang1690 於 2004/09/17 02:16:32
------
Andy Chang
leobxb
一般會員


發表:18
回覆:30
積分:14
註冊:2003-10-02

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-09-17 09:40:58 IP:220.229.xxx.xxx 未訂閱
關於上面的程式我又用了Win2000測試結果ok,但用WinXP還是不行說...(跟之前狀況一樣)    還有我用了axsoft大大寫的程式  
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
//共享
WideString netname="adua";
WideString path="d:\\adua";
WideString ServerName="myrain";
LPDWORD Param_Err=NULL;
SHARE_INFO_502 sh;
sh.shi502_netname=netname;
sh.shi502_type=STYPE_DISKTREE;
sh.shi502_remark=NULL;
sh.shi502_max_uses=0xFFFFFFFF;
sh.shi502_current_uses=10;
sh.shi502_path=path;
sh.shi502_passwd=NULL;
sh.shi502_reserved=0;
sh.shi502_security_descriptor=NULL;
sh.shi502_permissions=TRUSTEE_ACCESS_ALL;
DWORD msg=-1;
try
  {
  msg=NetShareAdd(ServerName,502,(char *)&sh,Param_Err);   //  0表示成功,53表示不成功
  }
catch(...)
  {
  MessageBox(Handle,"共享失敗!","錯誤",MB_OK|MB_ICONWARNING);
  return;
  }
if(msg==0)
  MessageBox(Handle,"共享成功!","成功",MB_OK|MB_ICONINFORMATION);
else
  MessageBox(Handle,"共享失敗!","錯誤",MB_OK|MB_ICONWARNING); 
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
WideString netname="adua";
WideString ServerName="myrain";
NetShareDel(ServerName,netname,0);
}
//---------------------------------------------------------------------------    
上面紅色的地方會出現問題組譯不過耶! 我有加
#include  
有收穫記得回饋,讓我們台灣跨出程式的出頭天...
andychang1690
資深會員


發表:20
回覆:694
積分:442
註冊:2003-03-14

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-09-17 11:29:34 IP:221.169.xxx.xxx 未訂閱
leobxb:
奇怪!我是Win-XP使用就沒問題,倒是
sh.shi502_permissions=TRUSTEE_ACCESS_ALL;
妳可以
#include "accctrl.h"
或我直接使用#define的方法
#define TRUSTEE_ACCESS_ALL          0xFFFFFFFFL
反而這隻我共享失敗,還是我不會用?
果然我夠笨!
 netname="adua" path="d:\\adua" ServerName="myrain">OK!    
Andy Chang 發表人 - andychang1690 於 2004/09/17 11:58:25 發表人 - andychang1690 於 2004/09/17 12:00:25
------
Andy Chang
leobxb
一般會員


發表:18
回覆:30
積分:14
註冊:2003-10-02

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-09-17 13:24:48 IP:220.229.xxx.xxx 未訂閱
andychang1690: 1.使用了你的方法後,我也是共用失敗. 2.我也是用我是Win-XP-Professional,BCB6啊,為什麼第一個程式我用起來就有問題呢?是不是因為我有更新WinXP的關係呢? 有收穫記得回饋,讓我們台灣跨出程式的出頭天...
andychang1690
資深會員


發表:20
回覆:694
積分:442
註冊:2003-03-14

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-09-17 14:47:24 IP:221.169.xxx.xxx 未訂閱
引言: andychang1690: 1.使用了你的方法後,我也是共用失敗. 2.我也是用我是Win-XP-Professional,BCB6啊,為什麼第一個程式我用起來就有問題呢?是不是因為我有更新WinXP的關係呢? 有收穫記得回饋,讓我們台灣跨出程式的出頭天...
leobxb:我也是Win-XP-Professional,BCB6!
我再Post一次這程式,於form上放置兩個Button。
Unit1.cpp
//---------------------------------------------------------------------------
#include 
#include 
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
#define TRUSTEE_ACCESS_ALL          0xFFFFFFFFL
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
  : TForm(Owner)
{
}
//---------------------------------------------------------------------------    void __fastcall TForm1::Button1Click(TObject *Sender)
{
  //共享
  WideString netname="USB";          // 共用名稱
  WideString path="d:\\USB";         // 共用目錄
  WideString ServerName="RexChang";  // 我的電腦名稱
  LPDWORD Param_Err=NULL;
  SHARE_INFO_502 sh;
  sh.shi502_netname=netname;
  sh.shi502_type=STYPE_DISKTREE;
  sh.shi502_remark=NULL;
  sh.shi502_max_uses=0xFFFFFFFF;
  sh.shi502_current_uses=10;
  sh.shi502_path=path;
  sh.shi502_passwd=NULL;
  sh.shi502_reserved=0;
  sh.shi502_security_descriptor=NULL;
  sh.shi502_permissions=TRUSTEE_ACCESS_ALL; //
  DWORD msg=-1;
  try  {
    msg=NetShareAdd(ServerName,502,(char *)&sh,Param_Err);   //  0表示成功,53表示不成功
  }
  catch(...)  {
    MessageBox(Handle,"共享失敗!","錯誤",MB_OK|MB_ICONWARNING);
    return;
  }
  if(msg==0)
    MessageBox(Handle,"共享成功!","成功",MB_OK|MB_ICONINFORMATION);
  else
    MessageBox(Handle,"共享失敗!","錯誤",MB_OK|MB_ICONWARNING);     
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
  // 解除共享
  WideString netname="USB";
  WideString ServerName="RexChang";
  NetShareDel(ServerName,netname,0);  
}
//---------------------------------------------------------------------------
我於Win-XP-Professional,BCB6!執行OK!
請參考!
Andy Chang
------
Andy Chang
andychang1690
資深會員


發表:20
回覆:694
積分:442
註冊:2003-03-14

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-09-17 14:55:27 IP:221.169.xxx.xxx 未訂閱
leobxb:我檢查一下我的Win-XP-Professional於Windows Update, 已經沒有可以Update的資訊!所以應該不是這問題! 請參考! Andy Chang
------
Andy Chang
系統時間:2024-05-04 19:34:53
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!