WEB开发网
开发学院软件开发C++ 如何在Win9x/2k下建立共享目录 阅读

如何在Win9x/2k下建立共享目录

 2008-03-08 12:47:23 来源:WEB开发网   
核心提示:在Windows中建立一个共享目录,通常是使用NetShareAdd函数.但是在Win2k和Win9x下,这个函数分别是包含在Netapi32.dll和Svrapi.dll中.那么假如直接在程序中使用Netapi32.lib或Svrapi.lib,在不同的操作系统下运行时会发生找不到xxx函数的输出错误. 解决的办法就

  在Windows中建立一个共享目录,通常是使用NetShareAdd函数.但是在Win2k和Win9x下,这个函数分别是包含在Netapi32.dll和Svrapi.dll中.
那么假如直接在程序中使用Netapi32.lib或Svrapi.lib,在不同的操作系统下运行时会发生找不到xxx函数的输出错误. 解决的办法就是通过GetPRocAddress动态获取NetShareAdd.正好ccrun在csdn回答一位网友的问题,顺便写了些代码,在这里贴出来.

注:
1. 以下代码已在Win2k ADV Server和Win9x SE中通过测试.编译时不需要包含lm.h或Svrapi.h,假如包含的话,会引起数据类型重名的错误.
2. 请使用Borland C++ Builder编译器.假如您用VC,个别参数需要改动

代码如下:

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;
  &n

Tags:如何 Win 建立

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接