Explorar o código

Windows局域网共享,使用账号密码登录共享目录

Jeff %!s(int64=6) %!d(string=hai) anos
pai
achega
4f20a34171

+ 26 - 0
局域网共享/LANShare.sln

@@ -0,0 +1,26 @@
+
+Microsoft Visual Studio Solution File, Format Version 10.00
+# Visual Studio 2008
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "LANShare", "LANShare\LANShare.vcproj", "{39C60BAC-D469-4AD2-A1AE-CB2179EDEED3}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "LANShareTest", "LANShareTest\LANShareTest.vcproj", "{2D8A0D50-5988-4B95-A3E2-69B5BC3C15EB}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Win32 = Debug|Win32
+		Release|Win32 = Release|Win32
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{39C60BAC-D469-4AD2-A1AE-CB2179EDEED3}.Debug|Win32.ActiveCfg = Debug|Win32
+		{39C60BAC-D469-4AD2-A1AE-CB2179EDEED3}.Debug|Win32.Build.0 = Debug|Win32
+		{39C60BAC-D469-4AD2-A1AE-CB2179EDEED3}.Release|Win32.ActiveCfg = Release|Win32
+		{39C60BAC-D469-4AD2-A1AE-CB2179EDEED3}.Release|Win32.Build.0 = Release|Win32
+		{2D8A0D50-5988-4B95-A3E2-69B5BC3C15EB}.Debug|Win32.ActiveCfg = Debug|Win32
+		{2D8A0D50-5988-4B95-A3E2-69B5BC3C15EB}.Debug|Win32.Build.0 = Debug|Win32
+		{2D8A0D50-5988-4B95-A3E2-69B5BC3C15EB}.Release|Win32.ActiveCfg = Release|Win32
+		{2D8A0D50-5988-4B95-A3E2-69B5BC3C15EB}.Release|Win32.Build.0 = Release|Win32
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+EndGlobal

+ 902 - 0
局域网共享/LANShare/LANShare.cpp

@@ -0,0 +1,902 @@
+// LANShare.cpp : 定义 DLL 的初始化例程。
+//
+
+#include "stdafx.h"
+#include "LANShare.h"
+
+#ifdef _DEBUG
+#define new DEBUG_NEW
+#endif
+
+//////////////////////////////////////////////////////////////////////////
+#include <shlwapi.h>
+
+#include <Winnetwk.h>
+#pragma comment(lib, "Mpr.lib.")
+
+#include <Lm.h>
+#include <Lmshare.h>
+#pragma comment(lib, "Netapi32.lib")
+
+#include <Aclapi.h>
+#pragma comment(lib, "Advapi32.lib")
+//////////////////////////////////////////////////////////////////////////
+//使用Windows的HeapAlloc函数进行动态内存分配
+#define myheapalloc(x) (HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, x))
+#define myheapfree(x)  (HeapFree(GetProcessHeap(), 0, x))
+
+typedef BOOL (WINAPI *SetSecurityDescriptorControlFnPtr)(
+	IN PSECURITY_DESCRIPTOR pSecurityDescriptor,
+	IN SECURITY_DESCRIPTOR_CONTROL ControlBitsOfInterest,
+	IN SECURITY_DESCRIPTOR_CONTROL ControlBitsToSet);
+
+typedef BOOL (WINAPI *AddAccessAllowedAceExFnPtr)(
+	IN PACL pAcl,
+	IN DWORD dwAceRevision,
+	IN DWORD AceFlags,
+	IN DWORD AccessMask,
+	IN PSID pSid
+	);
+
+//
+//TODO: 如果此 DLL 相对于 MFC DLL 是动态链接的,
+//		则从此 DLL 导出的任何调入
+//		MFC 的函数必须将 AFX_MANAGE_STATE 宏添加到
+//		该函数的最前面。
+//
+//		例如:
+//
+//		extern "C" BOOL PASCAL EXPORT ExportedFunction()
+//		{
+//			AFX_MANAGE_STATE(AfxGetStaticModuleState());
+//			// 此处为普通函数体
+//		}
+//
+//		此宏先于任何 MFC 调用
+//		出现在每个函数中十分重要。这意味着
+//		它必须作为函数中的第一个语句
+//		出现,甚至先于所有对象变量声明,
+//		这是因为它们的构造函数可能生成 MFC
+//		DLL 调用。
+//
+//		有关其他详细信息,
+//		请参阅 MFC 技术说明 33 和 58。
+//
+
+// CLANShareApp
+
+BEGIN_MESSAGE_MAP(CLANShareApp, CWinApp)
+END_MESSAGE_MAP()
+
+
+// CLANShareApp 构造
+
+CLANShareApp::CLANShareApp()
+{
+	// TODO: 在此处添加构造代码,
+	// 将所有重要的初始化放置在 InitInstance 中
+}
+
+
+// 唯一的一个 CLANShareApp 对象
+
+CLANShareApp theApp;
+
+
+// CLANShareApp 初始化
+
+BOOL CLANShareApp::InitInstance()
+{
+	CWinApp::InitInstance();
+
+	return TRUE;
+}
+
+
+//////////////////////////////////////////////////////////////////////////
+/************************************************************************/
+/*  函数:MultiToWide[5/14/2016 home];
+/*  描述:将多字节字符串转成宽字节字符串;
+/*  参数:;
+/*  	[IN] pszMultiString:多字节字符串;
+/*  返回:若转换成功,返回宽字节字符串, 否则返回NULL;
+/*  注意:;
+/*  示例:;
+/*
+/*  修改:;
+/*  日期:;
+/*  内容:;
+/************************************************************************/
+WCHAR* MultiToWide(IN const CHAR* pszMultiString)
+{
+	int wSize = MultiByteToWideChar(CP_ACP, 0, pszMultiString, -1, NULL, 0);
+	if (wSize == ERROR_NO_UNICODE_TRANSLATION || wSize == 0 )
+	{
+		return NULL;
+	}
+
+	WCHAR *punicode = new WCHAR[wSize];
+	int convresult = MultiByteToWideChar(CP_ACP, 0, pszMultiString, -1, punicode, wSize);
+	if (convresult != wSize)
+	{
+		if (punicode) delete []punicode;
+		return NULL;
+	}
+
+	return punicode;
+}
+
+INT WideToMulti(IN const WCHAR* pWideString, IN LPCH pMultiString, IN const int& nBufLen)
+{
+	INT nSize = WideCharToMultiByte(CP_OEMCP, 0, pWideString, -1, NULL, 0, NULL, NULL); 
+	if (nSize == ERROR_NO_UNICODE_TRANSLATION || nSize == 0 ) 
+	{ 
+		return 0;
+	} 
+
+	if ( nSize > nBufLen )
+		return 0;
+
+	INT nResult = WideCharToMultiByte(CP_OEMCP, 0, pWideString, -1, pMultiString, nSize, NULL, NULL); 
+	if (nResult != nSize) 
+	{ 
+		return 0;
+	} 
+
+	return nSize; 
+}
+
+/************************************************************************/
+/*  函数:DisConnectSession[5/14/2016 home];
+/*  描述:断开指定的局域网共享连接;
+/*  参数:;
+/*  	[IN] lpHostAddr:要断开连接的局域网地址;
+/*  返回:void;
+/*  注意:;
+/*  示例:;
+/*
+/*  修改:;
+/*  日期:;
+/*  内容:;
+/************************************************************************/
+extern "C" BOOL PASCAL EXPORT DisConnectSession( IN LPCTSTR lpHostAddr )
+{
+	if (NULL == lpHostAddr || lpHostAddr[0] == _T('\0'))
+		return FALSE;
+
+	DWORD dwRes = WNetCancelConnection2(lpHostAddr, CONNECT_UPDATE_PROFILE, TRUE);
+	if ( ERROR_SUCCESS == dwRes || ERROR_NOT_CONNECTED == dwRes)
+		_tprintf_s(_T("关掉局域网共享成功[%s]\n"), lpHostAddr);
+	else 
+		_tprintf_s(_T("关掉局域网共享失败[%s]Error:%d\n"), lpHostAddr, dwRes);
+
+	return ( ERROR_SUCCESS == dwRes || ERROR_NOT_CONNECTED == dwRes ) ? TRUE : FALSE;
+}
+
+/************************************************************************/
+/*  函数:[5/14/2016 home];
+/*  描述:取消共享,但并不是删除这个目录;
+/*  参数:;
+/*  	[IN] lpShareName:要取消的共享名;
+/*  返回:void;
+/*  注意:;
+/*  示例:;
+/*
+/*  修改:;
+/*  日期:;
+/*  内容:;
+/************************************************************************/
+extern "C" BOOL PASCAL EXPORT DelShareDirectoryW(IN LPCWSTR lpShareName)
+{
+	if (NULL == lpShareName || lpShareName[0] == _T('\0'))
+		return FALSE;
+
+	DWORD dwRes = NetShareDel(NULL, const_cast<LPWSTR>(lpShareName), NULL);
+	if ( dwRes == NERR_Success )
+		_tprintf_s(_T("删除共享成功"));
+	else
+		_tprintf_s(_T("删除共享失败,Error %d\n"), dwRes);
+	
+	return (dwRes == NERR_Success) ? TRUE : FALSE;
+}
+
+extern "C" BOOL PASCAL EXPORT DelShareDirectoryA(IN LPCCH lpShareName)
+{
+	if ( lpShareName == NULL )
+		return TRUE;
+
+	WCHAR* pShareName = MultiToWide(lpShareName);
+	BOOL bRes = DelShareDirectoryW(pShareName);
+
+	if ( pShareName )
+		delete []pShareName;
+
+	return bRes;
+}
+
+/************************************************************************/
+/*  函数:IsTheDirectoryShared[5/12/2016 IT];
+/*  描述:判断本地目录是否共享,若共享则返回共享名称;
+/*  参数:;
+/*  	[IN] lpDirectory:本地路径;
+/*  	[OUT] lpShareName:若本地路径已共享,返回共享名称;
+/*  	[IN] nBufLen:lpShareName缓冲区大小;
+/*  返回:若已共享返回TRUE;
+/*  注意:该函数字符编号是UICODE;
+/*  示例:;
+/*
+/*  修改:;
+/*  日期:;
+/*  内容:;
+/************************************************************************/
+extern "C" BOOL PASCAL EXPORT IsTheDirectorySharedW(IN LPCWSTR lpDirectory, OUT LPWSTR lpShareName  = NULL , IN const INT& nBufLen  = 0 )
+{
+	if ( lpDirectory == NULL || !PathFileExistsW(lpDirectory) ){
+		_tprintf_s(_T("要判断的路径无效"));
+		return FALSE;
+	}
+
+	if ( lpDirectory[0] == L'\\' && lpDirectory[1] == L'\\' ){
+		_tprintf_s(_T("要判断的路径是网络路径"));
+		return TRUE;
+	}
+
+	// 枚举本机所有共享目录;
+	PSHARE_INFO_502 BufPtr, p;
+	NET_API_STATUS res;
+	LPTSTR lpszServer = NULL;
+	DWORD er = 0, tr = 0, resume = 0, i;
+
+	do
+	{
+		res = NetShareEnum(NULL, 502, (LPBYTE*)&BufPtr, MAX_PREFERRED_LENGTH, &er, &tr, &resume);
+		if ( res == ERROR_SUCCESS || res == ERROR_MORE_DATA )
+		{
+			p = BufPtr;
+			for ( i = 1; i <= er; i++ )
+			{
+				if ( p->shi502_type == STYPE_DISKTREE )
+				{// 磁盘类型;
+					printf("%-20S%-30S\n", p->shi502_netname, p->shi502_path);
+					if ( wcscmp(lpDirectory, (WCHAR*)(p->shi502_path)) == 0 )
+					{
+						if ( lpShareName && nBufLen > 0 )
+							wcscpy_s(lpShareName, nBufLen, (WCHAR*)(p->shi502_netname));
+						NetApiBufferFree(BufPtr);
+						return TRUE;
+					}
+				}
+
+				p++;
+			}
+			NetApiBufferFree(BufPtr);
+		}
+	} while (res == ERROR_MORE_DATA );
+
+	return FALSE;
+}
+
+extern "C" BOOL PASCAL EXPORT IsTheDirectorySharedA(IN LPCCH lpDirectory, OUT LPCH lpShareName  = NULL , IN const INT& nBufLen  = 0  )
+{
+	if ( lpDirectory == NULL )
+		return FALSE;
+
+	WCHAR *pShareName = NULL;
+	WCHAR *pDirectory = MultiToWide(lpDirectory);
+	if ( lpShareName )
+	{
+		pShareName = new WCHAR[nBufLen + 1];
+		memset(pShareName, 0, sizeof(WCHAR)*(nBufLen+1));
+	}
+
+	BOOL bRes = IsTheDirectorySharedW(pDirectory, pShareName, nBufLen);
+	if ( bRes )
+		WideToMulti(pShareName, lpShareName, nBufLen);
+	
+	if ( pDirectory )
+		delete []pDirectory;
+	if ( pShareName )
+		delete []pShareName;
+
+	return bRes;
+}
+
+/************************************************************************/
+/*  函数:AccessShareDirectory[5/11/2016 IT];
+/*  描述:访问指定账号和密码的局域网共享目录;
+/*  参数:;
+/*  	[IN] lpUserName:登陆共享目录的账号;
+/*  	[IN] lpPasswd:登陆共享目录的密码;
+/*  	[IN] lpShareDirectory:要登陆的共享目录("\\it-pc\Test\123");
+/*  返回:成功返回true;
+/*  注意:;
+/*  示例:;
+/*
+/*  修改:;
+/*  日期:;
+/*  内容:;
+/************************************************************************/
+extern "C" BOOL PASCAL EXPORT AccessShareDirectory(IN LPCTSTR lpUserName, IN LPCTSTR lpPasswd, IN LPCTSTR lpShareDirectory)
+{
+	// 参数有效性判断;
+	if (lpShareDirectory == NULL || 
+		lpShareDirectory[0] == _T('\0') ||
+		lpShareDirectory[0] != _T('\\'))
+	{
+		return FALSE;
+	}
+
+	int nPos = 0;
+	DWORD dwError = 0;
+	CString strHostAddr = lpShareDirectory;
+	// 从lpShareDirectory解析出网络主机地址,且主机名末尾不能包含'\\';
+	if ( strHostAddr.Left(2) != _T("\\\\") )
+		return FALSE;
+
+	nPos = strHostAddr.Mid(2).Find(_T("\\"));
+	if ( nPos != -1 )
+	{
+		strHostAddr = strHostAddr.Left(nPos+2);
+	}
+
+	// 断开之前的连接;
+	dwError = WNetCancelConnection2(strHostAddr, CONNECT_UPDATE_PROFILE, TRUE);
+	if ( dwError != ERROR_SUCCESS && dwError != ERROR_NOT_CONNECTED)
+	{
+		_tprintf_s(_T("断开失败\n"));
+	}
+
+	NETRESOURCE net_Resource;
+	net_Resource.dwDisplayType = RESOURCEDISPLAYTYPE_DIRECTORY;
+	net_Resource.dwScope = RESOURCE_CONNECTED;
+	net_Resource.dwType = RESOURCETYPE_ANY;
+	net_Resource.dwUsage = 0;
+	net_Resource.lpComment = TEXT("");
+	net_Resource.lpLocalName = NULL;			// 不映射成本地驱动器;
+	net_Resource.lpProvider= NULL;
+	net_Resource.lpRemoteName = const_cast<LPTSTR>(strHostAddr.GetString());
+	DWORD dwFlags = CONNECT_UPDATE_PROFILE;
+	dwError = WNetAddConnection2(&net_Resource, lpPasswd, lpUserName, dwFlags);
+	switch(dwError)
+	{
+	case ERROR_SUCCESS:
+		_tprintf(TEXT("访问共享成功!"));
+		break;
+	case ERROR_ACCESS_DENIED:
+		_tprintf(TEXT("没有权访问!"));
+		break;
+	case ERROR_ALREADY_ASSIGNED:
+		ShellExecute(NULL, TEXT("open"), TEXT("z:"), NULL, NULL, SW_SHOWNORMAL);
+		break;
+	case ERROR_INVALID_ADDRESS:
+		_tprintf(TEXT("IP地址无效"));
+		break;
+	case ERROR_NO_NETWORK:
+		_tprintf(TEXT("网络不可达!"));
+		break;
+	}
+
+	return dwError;
+}
+
+/************************************************************************/
+/*  函数:[5/11/2016 Home];
+/*  描述:;
+/*  参数:;
+/*  	[IN] lpDirectory:要共享的本地目录;
+/*  	[IN] lpShareName:要共享的本地目录的共享名称;
+/*  返回:成功返回0;
+/*  注意:该函数字符编号是UICODE;
+/*  示例:;
+/*
+/*  修改:;
+/*  日期:;
+/*  内容:;
+/************************************************************************/
+extern "C" BOOL PASCAL EXPORT AddShareDirectoryW(IN LPCWSTR lpDirectory, IN LPCWSTR lpShareName)
+{
+	if ( lpDirectory == NULL || !PathFileExistsW(lpDirectory) ){
+		_tprintf_s(_T("设置共享的目录无效\n"));
+		return FALSE;
+	}
+
+	if ( lpShareName == NULL || lpShareName[0] == _T('\0') ){
+		_tprintf_s(_T("设置共享的名称无效\n"));
+		return FALSE;
+	}
+
+	DWORD dwEr = 0;
+	DWORD dwRet = 0;
+	SHARE_INFO_2 si2;
+	memset(&si2, 0, sizeof(SHARE_INFO_2));
+
+	si2.shi2_netname = const_cast<LPWSTR>(lpShareName);			// 要设置目录的共享名称(必须为Unicode);
+	si2.shi2_type = STYPE_DISKTREE;			// 要共享的类型STYPE_DISKTREE=磁盘驱动器;
+	si2.shi2_remark = NULL;					// 共享资源的可选注释;
+	si2.shi2_permissions = ACCESS_ALL;		// 共享资源的共享权限(对xp来说,这个值设置成什么都是无效的);
+	si2.shi2_max_uses = -1;					// 共享资源最大可访问用户量;
+	si2.shi2_current_uses = 0;				// 当前可访问量;
+	si2.shi2_passwd = NULL;					// 共享密码 NULL表示没密码;
+	si2.shi2_path = const_cast<LPWSTR>(lpDirectory);			// 要共享的目录;
+
+	dwRet = NetShareAdd(NULL, 2, (LPBYTE)&si2, &dwEr);
+	if ( dwRet == NERR_Success || dwRet == NERR_DuplicateShare )
+	{
+		_tprintf_s(_T("设置共享成功\n"));
+		// 刷新文件列表;
+		SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, NULL, NULL);
+	}
+	else
+	{
+		_tprintf_s(_T("设置共享失败 Error %u\n"), dwRet);
+	}
+
+	return ( dwRet == NERR_Success || dwRet == NERR_DuplicateShare ) ? TRUE : FALSE;
+	//return SetNetShareSecurity(lpShareName, _T("Everyone"));
+}
+
+extern "C" BOOL PASCAL EXPORT AddShareDirectoryA(IN LPCCH lpDirectory, IN LPCCH lpShareName)
+{
+	WCHAR *pShareName = NULL;
+	WCHAR *pDirectory = NULL;
+	if ( lpDirectory )
+		pDirectory = MultiToWide(lpDirectory);
+
+	if ( lpShareName )
+		pShareName = MultiToWide(lpShareName);
+
+	BOOL bRes = AddShareDirectoryW(pDirectory, pShareName);
+	if ( pDirectory )
+		delete []pDirectory;
+	if ( pShareName )
+		delete []pShareName;
+
+	return bRes;
+}
+
+/************************************************************************/
+/*  函数:SetNetShareSecurity[5/12/2016 IT];
+/*  描述:设置共享目录的安全选项;
+/*  参数:;
+/*  	[IN] lpShareName:要设置的共享名称;
+/*  	[OUT] lpUsser:安全选项用户;
+/*  	[IN/OUT] :;
+/*  返回:void;
+/*  注意:;
+/*  示例:;
+/*
+/*  修改:;
+/*  日期:;
+/*  内容:;
+/************************************************************************/
+extern "C" BOOL PASCAL EXPORT SetNetShareSecurity(IN LPCTSTR lpShareName, IN LPCTSTR lpUsser, IN const DWORD& dwPermissions  = STANDARD_RIGHTS_ALL| SPECIFIC_RIGHTS_ALL )
+{
+	if ( lpShareName == NULL || lpUsser == NULL ){
+		_tprintf_s(_T("共享名称或用户名无效\n"));
+		return FALSE;
+	}
+
+	// 设置成功后,给共享目录分配权限;
+	DWORD dwRes = 0;
+	PACL pOldDacl = NULL;
+	PACL pNewDacl = NULL;
+	EXPLICIT_ACCESS ea;
+	PSECURITY_DESCRIPTOR psd = NULL;
+
+	// 获取指定对象名称的DACL(Discretionary Access Control List任意访问控制列表)指针对象;
+	dwRes = GetNamedSecurityInfo(const_cast<LPTSTR>(lpShareName), SE_LMSHARE, DACL_SECURITY_INFORMATION, NULL, NULL, &pOldDacl, NULL, &psd);
+	if (  ERROR_SUCCESS != dwRes ) {
+		_tprintf_s(_T("GetNamedSecurityInfo Error %u\n"), dwRes); // dwRes = 2310表示没有这个共享名称;
+		goto Cleanup;
+	}
+
+	// 为新的ACE初始化EXPLICIT_ACCESS结构体;
+	ZeroMemory(&ea, sizeof(EXPLICIT_ACCESS));
+	// 设置最重要的访问权限;STANDARD_RIGHTS_ALL全部标准权限;SPECIFIC_RIGHTS_ALL全部特殊权限;
+	ea.grfAccessPermissions = dwPermissions;
+	ea.grfAccessMode = SET_ACCESS;
+	ea.grfInheritance = CONTAINER_INHERIT_ACE;
+	ea.Trustee.TrusteeForm = TRUSTEE_IS_NAME;
+	ea.Trustee.ptstrName = const_cast<LPTSTR>(lpUsser);
+
+	// 合并新的ACE到现有的DACL来创建新的ACL;
+	dwRes = SetEntriesInAcl(1, &ea, pOldDacl, &pNewDacl);
+	if (ERROR_SUCCESS != dwRes)  {
+		_tprintf_s(_T("SetEntriesInAcl Error %u\n"), dwRes );
+		goto Cleanup; 
+	}  
+
+	// 用新的ACL附加到DACL对象中;
+	dwRes = SetNamedSecurityInfo(const_cast<LPTSTR>(lpShareName), SE_LMSHARE, DACL_SECURITY_INFORMATION, NULL, NULL, pNewDacl, NULL);
+	if (ERROR_SUCCESS != dwRes)  {
+		_tprintf_s( _T("SetNamedSecurityInfo Error %u\n"), dwRes );
+		goto Cleanup; 
+	} 
+
+	// 设置成功后,刷新文件夹;
+	SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, NULL, NULL);
+Cleanup:
+	if ( psd != NULL )
+		LocalFree((HLOCAL)psd);
+
+	if ( pNewDacl != NULL )
+		LocalFree((HLOCAL)pNewDacl);
+
+	if ( pOldDacl != NULL )
+		LocalFree((HLOCAL)pNewDacl);
+
+	return (dwRes == ERROR_SUCCESS) ? TRUE : FALSE;
+}
+
+
+/************************************************************************/
+/*  函数:[5/14/2016 home];
+/*  描述:给指定的目录添加安全权限;
+/*  参数:;
+/*  	[IN] lpszFileName:文件或目录名;
+/*  	[IN] lpszAccountName:要给文件或目录添加的安全账号;
+/*  	[IN] dwAccessMask:要添加的权限值;
+/*  返回:void;
+/*  注意:;
+/*  示例:;
+/*
+/*  修改:;
+/*  日期:;
+/*  内容:;
+/************************************************************************/
+extern "C" BOOL PASCAL EXPORT AddAccessRights(IN LPCTSTR lpszFileName, IN LPCTSTR lpszAccountName, IN const DWORD& dwAccessMask  = STANDARD_RIGHTS_ALL| SPECIFIC_RIGHTS_ALL )
+{
+	// 声明SID变量;
+	SID_NAME_USE   snuType;
+
+	// 声明和LookupAccountName相关的变量(注意,全为0,要在程序中动态分配);
+	TCHAR *        szDomain       = NULL;
+	DWORD          cbDomain       = 0;
+	LPVOID         pUserSID       = NULL;
+	DWORD          cbUserSID      = 0;
+
+	// 和文件相关的安全描述符 SD 的变量;
+	PSECURITY_DESCRIPTOR pFileSD  = NULL;     // 结构变量;
+	DWORD          cbFileSD       = 0;        // SD的size;
+
+	// 一个新的SD的变量,用于构造新的ACL(把已有的ACL和需要新加的ACL整合起来);
+	SECURITY_DESCRIPTOR  newSD;
+
+	// 和ACL 相关的变量;
+	PACL           pACL           = NULL;
+	BOOL           fDaclPresent = FALSE;
+	BOOL           fDaclDefaulted = FALSE;
+	ACL_SIZE_INFORMATION AclInfo;
+
+	// 一个新的 ACL 变量;
+	PACL           pNewACL        = NULL;  //结构指针变量;
+	DWORD          cbNewACL       = 0;     //ACL的size;
+
+	// 一个临时使用的 ACE 变量;
+	LPVOID         pTempAce       = NULL;
+	UINT           CurrentAceIndex = 0;  //ACE在ACL中的位置;
+
+	UINT           newAceIndex = 0;  //新添的ACE在ACL中的位置;
+
+	//API函数的返回值,假设所有的函数都返回失败。
+	BOOL           fResult = FALSE;
+	BOOL           fAPISuccess = FALSE;
+
+	SECURITY_INFORMATION secInfo = DACL_SECURITY_INFORMATION;
+
+	// 下面的两个函数是新的API函数,仅在Windows 2000以上版本的操作系统支持。 
+	// 在此将从Advapi32.dll文件中动态载入。如果你使用VC++ 6.0编译程序,而且你想
+	// 使用这两个函数的静态链接。则请为你的编译加上:/D_WIN32_WINNT=0x0500
+	// 的编译参数。并且确保你的SDK的头文件和lib文件是最新的。
+	SetSecurityDescriptorControlFnPtr _SetSecurityDescriptorControl = NULL;
+	AddAccessAllowedAceExFnPtr _AddAccessAllowedAceEx = NULL;
+
+	__try {
+		// 
+		// STEP 1: 通过用户名取得SID
+		//     在这一步中LookupAccountName函数被调用了两次,第一次是取出所需要
+		// 的内存的大小,然后,进行内存分配。第二次调用才是取得了用户的帐户信息。
+		// LookupAccountName同样可以取得域用户或是用户组的信息。(请参看MSDN)
+		//
+
+		fAPISuccess = LookupAccountName(NULL, lpszAccountName,pUserSID, &cbUserSID, szDomain, &cbDomain, &snuType);
+
+		// 以上调用API会失败,失败原因是内存不足。并把所需要的内存大小传出。
+		// 下面是处理非内存不足的错误。
+
+		if (fAPISuccess)
+			__leave;
+		else if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) {
+			_tprintf(TEXT("LookupAccountName() failed. Error %d/n"), GetLastError());
+			__leave;
+		}
+
+		pUserSID = myheapalloc(cbUserSID);
+		if (!pUserSID) {
+			_tprintf(TEXT("HeapAlloc() failed. Error %d/n"), GetLastError());
+			__leave;
+		}
+
+		szDomain = (TCHAR *) myheapalloc(cbDomain * sizeof(TCHAR));
+		if (!szDomain) {
+			_tprintf(TEXT("HeapAlloc() failed. Error %d/n"), GetLastError());
+			__leave;
+		}
+
+		fAPISuccess = LookupAccountName(NULL, lpszAccountName,pUserSID, &cbUserSID, szDomain, &cbDomain, &snuType);
+		if (!fAPISuccess) {
+			_tprintf(TEXT("LookupAccountName() failed. Error %d/n"), GetLastError());
+			__leave;
+		}
+
+		// 
+		// STEP 2: 取得文件(目录)相关的安全描述符SD
+		//     使用GetFileSecurity函数取得一份文件SD的拷贝,同样,这个函数也
+		// 是被调用两次,第一次同样是取SD的内存长度。注意,SD有两种格式:自相关的
+		// (self-relative)和 完全的(absolute),GetFileSecurity只能取到“自
+		// 相关的”,而SetFileSecurity则需要完全的。这就是为什么需要一个新的SD,
+		// 而不是直接在GetFileSecurity返回的SD上进行修改。因为“自相关的”信息
+		// 是不完整的。
+
+		fAPISuccess = GetFileSecurity(lpszFileName, secInfo, pFileSD, 0, &cbFileSD);
+
+		// 以上调用API会失败,失败原因是内存不足。并把所需要的内存大小传出。
+		// 下面是处理非内存不足的错误。
+		if (fAPISuccess)
+			__leave;
+		else if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) {
+			_tprintf(TEXT("GetFileSecurity() failed. Error %d/n"), GetLastError());
+			__leave;
+		}
+
+		pFileSD = myheapalloc(cbFileSD);
+		if (!pFileSD) {
+			_tprintf(TEXT("HeapAlloc() failed. Error %d/n"), GetLastError());
+			__leave;
+		}
+
+		fAPISuccess = GetFileSecurity(lpszFileName, secInfo, pFileSD, cbFileSD, &cbFileSD);
+		if (!fAPISuccess) {
+			_tprintf(TEXT("GetFileSecurity() failed. Error %d/n"), GetLastError());
+			__leave;
+		}
+
+		// 
+		// STEP 3: 初始化一个新的SD
+		// 
+		if (!InitializeSecurityDescriptor(&newSD, SECURITY_DESCRIPTOR_REVISION)) {
+			_tprintf(TEXT("InitializeSecurityDescriptor() failed. Error %d/n"), GetLastError());
+			__leave;
+		}
+
+		// 
+		// STEP 4: 从GetFileSecurity 返回的SD中取DACL
+		// 
+		if (!GetSecurityDescriptorDacl(pFileSD, &fDaclPresent, &pACL, &fDaclDefaulted)) {
+			_tprintf(TEXT("GetSecurityDescriptorDacl() failed. Error %d/n"), GetLastError());
+			__leave;
+		}
+
+		// 
+		// STEP 5: 取 DACL的内存size
+		//     GetAclInformation可以提供DACL的内存大小。只传入一个类型为
+		// ACL_SIZE_INFORMATION的structure的参数,需DACL的信息,是为了
+		// 方便我们遍历其中的ACE。
+		AclInfo.AceCount = 0; // Assume NULL DACL.
+		AclInfo.AclBytesFree = 0;
+		AclInfo.AclBytesInUse = sizeof(ACL);
+
+		if (pACL == NULL)
+			fDaclPresent = FALSE;
+
+		// 如果DACL不为空,则取其信息。(大多数情况下“自关联”的DACL为空)
+		if (fDaclPresent) {            
+			if (!GetAclInformation(pACL, &AclInfo, sizeof(ACL_SIZE_INFORMATION), AclSizeInformation)) {
+				_tprintf(TEXT("GetAclInformation() failed. Error %d/n"),GetLastError());
+				__leave;
+			}
+		}
+
+		// 
+		// STEP 6: 计算新的ACL的size
+		//    计算的公式是:原有的DACL的size加上需要添加的一个ACE的size,以
+		// 及加上一个和ACE相关的SID的size,最后减去两个字节以获得精确的大小。
+		cbNewACL = AclInfo.AclBytesInUse + sizeof(ACCESS_ALLOWED_ACE) + GetLengthSid(pUserSID) - sizeof(DWORD);
+
+
+		// 
+		// STEP 7: 为新的ACL分配内存
+		// 
+		pNewACL = (PACL) myheapalloc(cbNewACL);
+		if (!pNewACL) {
+			_tprintf(TEXT("HeapAlloc() failed. Error %d/n"), GetLastError());
+			__leave;
+		}
+
+		// 
+		// STEP 8: 初始化新的ACL结构
+		// 
+		if (!InitializeAcl(pNewACL, cbNewACL, ACL_REVISION2)) {
+			_tprintf(TEXT("InitializeAcl() failed. Error %d/n"), GetLastError());
+			__leave;
+		}
+
+		// 
+		// STEP 9  如果文件(目录) DACL 有数据,拷贝其中的ACE到新的DACL中
+		// 
+		//     下面的代码假设首先检查指定文件(目录)是否存在的DACL,如果有的话,
+		// 那么就拷贝所有的ACE到新的DACL结构中,我们可以看到其遍历的方法是采用
+		// ACL_SIZE_INFORMATION结构中的AceCount成员来完成的。在这个循环中,
+		// 会按照默认的ACE的顺序来进行拷贝(ACE在ACL中的顺序是很关键的),在拷
+		// 贝过程中,先拷贝非继承的ACE(我们知道ACE会从上层目录中继承下来)
+		//
+
+		newAceIndex = 0;
+
+		if (fDaclPresent && AclInfo.AceCount) {
+
+			for (CurrentAceIndex = 0; CurrentAceIndex < AclInfo.AceCount;CurrentAceIndex++) {
+				// 
+				// STEP 10: 从DACL中取ACE
+				// 
+				if (!GetAce(pACL, CurrentAceIndex, &pTempAce)) {
+					_tprintf(TEXT("GetAce() failed. Error %d/n"), GetLastError());
+					__leave;
+				}
+
+				// 
+				// STEP 11: 检查是否是非继承的ACE
+				//     如果当前的ACE是一个从父目录继承来的ACE,那么就退出循环。
+				// 因为,继承的ACE总是在非继承的ACE之后,而我们所要添加的ACE
+				// 应该在已有的非继承的ACE之后,所有的继承的ACE之前。退出循环
+				// 正是为了要添加一个新的ACE到新的DACL中,这后,我们再把继承的
+				// ACE拷贝到新的DACL中。
+				//
+				if (((ACCESS_ALLOWED_ACE *)pTempAce)->Header.AceFlags & INHERITED_ACE)
+					break;
+
+				// 
+				// STEP 12: 检查要拷贝的ACE的SID是否和需要加入的ACE的SID一样,
+				// 如果一样,那么就应该废掉已存在的ACE,也就是说,同一个用户的存取
+				// 权限的设置的ACE,在DACL中应该唯一。这在里,跳过对同一用户已设置
+				// 了的ACE,仅是拷贝其它用户的ACE。
+				// 
+				if (EqualSid(pUserSID,&(((ACCESS_ALLOWED_ACE *)pTempAce)->SidStart)))
+					continue;
+
+				// 
+				// STEP 13: 把ACE加入到新的DACL中
+				//    下面的代码中,注意 AddAce 函数的第三个参数,这个参数的意思是 
+				// ACL中的索引值,意为要把ACE加到某索引位置之后,参数MAXDWORD的
+				// 意思是确保当前的ACE是被加入到最后的位置。
+				//
+				if (!AddAce(pNewACL, ACL_REVISION, MAXDWORD, pTempAce,((PACE_HEADER) pTempAce)->AceSize)) {
+					_tprintf(TEXT("AddAce() failed. Error %d/n"), GetLastError());
+					__leave;
+				}
+
+				newAceIndex++;
+			}
+		}
+
+		// 
+		// STEP 14: 把一个 access-allowed 的ACE 加入到新的DACL中
+		//     前面的循环拷贝了所有的非继承且SID为其它用户的ACE,退出循环的第一件事
+		// 就是加入我们指定的ACE。请注意首先先动态装载了一个AddAccessAllowedAceEx
+		// 的API函数,如果装载不成功,就调用AddAccessAllowedAce函数。前一个函数仅
+		// 在Windows 2000以后的版本支持,NT则没有,我们为了使用新版本的函数,我们首
+		// 先先检查一下当前系统中可不可以装载这个函数,如果可以则就使用。使用动态链接
+		// 比使用静态链接的好处是,程序运行时不会因为没有这个API函数而报错。
+		// 
+		// Ex版的函数多出了一个参数AceFlag(第三人参数),用这个参数我们可以来设置一
+		// 个叫ACE_HEADER的结构,以便让我们所设置的ACE可以被其子目录所继承下去,而 
+		// AddAccessAllowedAce函数不能定制这个参数,在AddAccessAllowedAce函数
+		// 中,其会把ACE_HEADER这个结构设置成非继承的。
+		// 
+		_AddAccessAllowedAceEx = (AddAccessAllowedAceExFnPtr)GetProcAddress(GetModuleHandle(TEXT("advapi32.dll")),"AddAccessAllowedAceEx");
+
+		if (_AddAccessAllowedAceEx) {
+			if (!_AddAccessAllowedAceEx(pNewACL, ACL_REVISION2,CONTAINER_INHERIT_ACE | OBJECT_INHERIT_ACE ,dwAccessMask, pUserSID)) {
+				_tprintf(TEXT("AddAccessAllowedAceEx() failed. Error %d/n"), GetLastError());
+				__leave;
+			}
+		}else{
+			if (!AddAccessAllowedAce(pNewACL, ACL_REVISION2, dwAccessMask, pUserSID)) {
+				_tprintf(TEXT("AddAccessAllowedAce() failed. Error %d/n"), GetLastError());
+				__leave;
+			}
+		}
+
+		// 
+		// STEP 15: 按照已存在的ACE的顺序拷贝从父目录继承而来的ACE
+		// 
+		if (fDaclPresent && AclInfo.AceCount) {
+			for (; CurrentAceIndex < AclInfo.AceCount;CurrentAceIndex++) {
+				// 
+				// STEP 16: 从文件(目录)的DACL中继续取ACE
+				// 
+				if (!GetAce(pACL, CurrentAceIndex, &pTempAce)) {
+					_tprintf(TEXT("GetAce() failed. Error %d/n"), GetLastError());
+					__leave;
+				}
+
+				// 
+				// STEP 17: 把ACE加入到新的DACL中
+				// 
+				if (!AddAce(pNewACL, ACL_REVISION, MAXDWORD, pTempAce,((PACE_HEADER) pTempAce)->AceSize)) {
+					_tprintf(TEXT("AddAce() failed. Error %d/n"), GetLastError());
+					__leave;
+				}
+			}
+		}
+
+		// 
+		// STEP 18: 把新的ACL设置到新的SD中
+		// 
+		if (!SetSecurityDescriptorDacl(&newSD, TRUE, pNewACL, FALSE)) {
+			_tprintf(TEXT("SetSecurityDescriptorDacl() failed. Error %d/n"),GetLastError());
+			__leave;
+		}
+
+		// 
+		// STEP 19: 把老的SD中的控制标记再拷贝到新的SD中,我们使用的是一个叫 
+		// SetSecurityDescriptorControl() 的API函数,这个函数同样只存在于
+		// Windows 2000以后的版本中,所以我们还是要动态地把其从advapi32.dll 
+		// 中载入,如果系统不支持这个函数,那就不拷贝老的SD的控制标记了。
+		// 
+		_SetSecurityDescriptorControl =(SetSecurityDescriptorControlFnPtr)GetProcAddress(GetModuleHandle(TEXT("advapi32.dll")),"SetSecurityDescriptorControl");
+		if (_SetSecurityDescriptorControl) {
+
+			SECURITY_DESCRIPTOR_CONTROL controlBitsOfInterest = 0;
+			SECURITY_DESCRIPTOR_CONTROL controlBitsToSet = 0;
+			SECURITY_DESCRIPTOR_CONTROL oldControlBits = 0;
+			DWORD dwRevision = 0;
+
+			if (!GetSecurityDescriptorControl(pFileSD, &oldControlBits, &dwRevision)) {
+				_tprintf(TEXT("GetSecurityDescriptorControl() failed. Error %d/n"), GetLastError());
+				__leave;
+			}
+
+			if (oldControlBits & SE_DACL_AUTO_INHERITED) {
+				controlBitsOfInterest =
+					SE_DACL_AUTO_INHERIT_REQ |
+					SE_DACL_AUTO_INHERITED ;
+				controlBitsToSet = controlBitsOfInterest;
+			}
+			else if (oldControlBits & SE_DACL_PROTECTED) {
+				controlBitsOfInterest = SE_DACL_PROTECTED;
+				controlBitsToSet = controlBitsOfInterest;
+			}       
+
+			if (controlBitsOfInterest) {
+				if (!_SetSecurityDescriptorControl(&newSD,controlBitsOfInterest,controlBitsToSet)) {
+					_tprintf(TEXT("SetSecurityDescriptorControl() failed. Error %d/n"), GetLastError());
+					__leave;
+				}
+			}
+		}
+
+		// 
+		// STEP 20: 把新的SD设置设置到文件的安全属性中(千山万水啊,终于到了)
+		// 
+		if (!SetFileSecurity(lpszFileName, secInfo,&newSD)) {
+			_tprintf(TEXT("SetFileSecurity() failed. Error %d/n"), GetLastError());
+			__leave;
+		}
+
+		fResult = TRUE;
+
+	} 
+	__finally 
+	{
+		// 
+		// STEP 21: 释放已分配的内存,以免Memory Leak
+		// 
+		if (pUserSID)  myheapfree(pUserSID);
+		if (szDomain)  myheapfree(szDomain);
+		if (pFileSD) myheapfree(pFileSD);
+		if (pNewACL) myheapfree(pNewACL);
+	}
+
+	return fResult;
+}

+ 17 - 0
局域网共享/LANShare/LANShare.def

@@ -0,0 +1,17 @@
+; LANShare.def : 声明 DLL 的模块参数。
+
+LIBRARY      "LANShare"
+
+EXPORTS
+    ; 此处可以是显式导出
+	DisConnectSession
+	DelShareDirectoryW
+	DelShareDirectoryA
+	IsTheDirectorySharedW
+	IsTheDirectorySharedA
+	AccessShareDirectory
+	AddShareDirectoryW
+	AddShareDirectoryA
+	SetNetShareSecurity
+	AddAccessRights
+	

+ 27 - 0
局域网共享/LANShare/LANShare.h

@@ -0,0 +1,27 @@
+// LANShare.h : LANShare DLL 的主头文件
+//
+
+#pragma once
+
+#ifndef __AFXWIN_H__
+	#error "在包含此文件之前包含“stdafx.h”以生成 PCH 文件"
+#endif
+
+#include "resource.h"		// 主符号
+
+
+// CLANShareApp
+// 有关此类实现的信息,请参阅 LANShare.cpp
+//
+
+class CLANShareApp : public CWinApp
+{
+public:
+	CLANShareApp();
+
+// 重写
+public:
+	virtual BOOL InitInstance();
+
+	DECLARE_MESSAGE_MAP()
+};

+ 138 - 0
局域网共享/LANShare/LANShare.rc

@@ -0,0 +1,138 @@
+// Microsoft Visual C++ generated resource script.
+//
+#include "resource.h"
+
+#define APSTUDIO_READONLY_SYMBOLS
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 2 resource.
+//
+#ifndef APSTUDIO_INVOKED
+#include "targetver.h"
+#endif
+#include "afxres.h"
+
+/////////////////////////////////////////////////////////////////////////////
+#undef APSTUDIO_READONLY_SYMBOLS
+
+/////////////////////////////////////////////////////////////////////////////
+// 中文(中华人民共和国) resources
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)
+#ifdef _WIN32
+LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED
+#pragma code_page(936)
+#endif //_WIN32
+
+#ifdef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// TEXTINCLUDE
+//
+
+1 TEXTINCLUDE 
+BEGIN
+    "resource.h\0"
+END
+
+2 TEXTINCLUDE 
+BEGIN
+    "#ifndef APSTUDIO_INVOKED\r\n"
+    "#include ""targetver.h""\r\n"
+    "#endif\r\n"
+    "#include ""afxres.h""\r\n"
+    "\0"
+END
+
+3 TEXTINCLUDE 
+BEGIN
+    "#define _AFX_NO_SPLITTER_RESOURCES\r\n"
+    "#define _AFX_NO_OLE_RESOURCES\r\n"
+    "#define _AFX_NO_TRACKER_RESOURCES\r\n"
+    "#define _AFX_NO_PROPERTY_RESOURCES\r\n"
+    "\r\n"
+    "#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)\r\n"
+    "LANGUAGE 4, 2\r\n"
+    "#pragma code_page(936)\r\n"
+    "#include ""res\\LANShare.rc2""  // 非 Microsoft Visual C++ 编辑的资源\r\n"
+    "#include ""l.CHS\\afxres.rc""      // 标准组件\r\n"
+    "#endif\r\n"
+    "\0"
+END
+
+#endif    // APSTUDIO_INVOKED
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Version
+//
+
+VS_VERSION_INFO VERSIONINFO
+#ifdef _AUTOVERSION_ //新加_AUTOVERSION_
+	FILEVERSION 1,0,1,$WCREV$
+#else
+	FILEVERSION 1,0,1,1
+#endif
+ PRODUCTVERSION 1,0,0,1
+ FILEFLAGSMASK 0x3fL
+#ifdef _DEBUG
+ FILEFLAGS 0x1L
+#else
+ FILEFLAGS 0x0L
+#endif
+ FILEOS 0x4L
+ FILETYPE 0x2L
+ FILESUBTYPE 0x0L
+BEGIN
+    BLOCK "StringFileInfo"
+    BEGIN
+        BLOCK "080403a8"
+        BEGIN
+            VALUE "CompanyName", "ITCivilian Corporation"
+            VALUE "FileDescription", "局域网共享设置模块"
+			VALUE "FileVersion", "1.0.0.1"
+#ifdef _AUTOVERSION_ //新加_AUTOVERSION_
+			VALUE "FileVersion", "1.0.1.$WCREV$"
+#else
+			VALUE "FileVersion", "1.0.1.1"
+#endif
+
+            VALUE "InternalName", "LANShare.dll"
+            VALUE "LegalCopyright", "ITCivilian Corporation"
+            VALUE "OriginalFilename", "LANShare.dll"
+            VALUE "ProductName", "局域网共享设置模块"
+            VALUE "ProductVersion", "1.0.0.1"
+        END
+    END
+    BLOCK "VarFileInfo"
+    BEGIN
+        VALUE "Translation", 0x804, 936
+    END
+END
+
+#endif    // 中文(中华人民共和国) resources
+/////////////////////////////////////////////////////////////////////////////
+
+
+
+#ifndef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 3 resource.
+//
+#define _AFX_NO_SPLITTER_RESOURCES
+#define _AFX_NO_OLE_RESOURCES
+#define _AFX_NO_TRACKER_RESOURCES
+#define _AFX_NO_PROPERTY_RESOURCES
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)
+LANGUAGE 4, 2
+#pragma code_page(936)
+#include "res\LANShare.rc2"  // 非 Microsoft Visual C++ 编辑的资源
+#include "l.CHS\afxres.rc"      // 标准组件
+#endif
+
+/////////////////////////////////////////////////////////////////////////////
+#endif    // not APSTUDIO_INVOKED
+

+ 263 - 0
局域网共享/LANShare/LANShare.vcproj

@@ -0,0 +1,263 @@
+<?xml version="1.0" encoding="gb2312"?>
+<VisualStudioProject
+	ProjectType="Visual C++"
+	Version="9.00"
+	Name="LANShare"
+	ProjectGUID="{39C60BAC-D469-4AD2-A1AE-CB2179EDEED3}"
+	RootNamespace="LANShare"
+	Keyword="MFCDLLProj"
+	TargetFrameworkVersion="196613"
+	>
+	<Platforms>
+		<Platform
+			Name="Win32"
+		/>
+	</Platforms>
+	<ToolFiles>
+	</ToolFiles>
+	<Configurations>
+		<Configuration
+			Name="Debug|Win32"
+			OutputDirectory="..\..\..\bin\$(SolutionName)"
+			IntermediateDirectory="$(OutDir)\$(ProjectName)\$(ConfigurationName)"
+			ConfigurationType="2"
+			UseOfMFC="2"
+			CharacterSet="2"
+			>
+			<Tool
+				Name="VCPreBuildEventTool"
+			/>
+			<Tool
+				Name="VCCustomBuildTool"
+			/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"
+			/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"
+			/>
+			<Tool
+				Name="VCMIDLTool"
+				PreprocessorDefinitions="_DEBUG"
+				MkTypLibCompatible="false"
+			/>
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="0"
+				PreprocessorDefinitions="WIN32;_WINDOWS;_DEBUG;_USRDLL"
+				MinimalRebuild="true"
+				BasicRuntimeChecks="3"
+				RuntimeLibrary="3"
+				UsePrecompiledHeader="2"
+				WarningLevel="3"
+				DebugInformationFormat="4"
+			/>
+			<Tool
+				Name="VCManagedResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCResourceCompilerTool"
+				PreprocessorDefinitions="_DEBUG"
+				Culture="2052"
+				AdditionalIncludeDirectories="$(IntDir)"
+			/>
+			<Tool
+				Name="VCPreLinkEventTool"
+			/>
+			<Tool
+				Name="VCLinkerTool"
+				LinkIncremental="2"
+				UACExecutionLevel="2"
+				ModuleDefinitionFile=".\LANShare.def"
+				GenerateDebugInformation="true"
+				SubSystem="2"
+				TargetMachine="1"
+			/>
+			<Tool
+				Name="VCALinkTool"
+			/>
+			<Tool
+				Name="VCManifestTool"
+			/>
+			<Tool
+				Name="VCXDCMakeTool"
+			/>
+			<Tool
+				Name="VCBscMakeTool"
+			/>
+			<Tool
+				Name="VCFxCopTool"
+			/>
+			<Tool
+				Name="VCAppVerifierTool"
+			/>
+			<Tool
+				Name="VCPostBuildEventTool"
+			/>
+		</Configuration>
+		<Configuration
+			Name="Release|Win32"
+			OutputDirectory="..\..\..\bin\$(SolutionName)"
+			IntermediateDirectory="$(OutDir)\$(ProjectName)\$(ConfigurationName)"
+			ConfigurationType="2"
+			UseOfMFC="1"
+			CharacterSet="2"
+			WholeProgramOptimization="1"
+			>
+			<Tool
+				Name="VCPreBuildEventTool"
+				CommandLine="subwcrev.exe $(SolutionDir) $(ProjectDir)$(ProjectName).rc $(ProjectDir)$(ProjectName).rc_"
+			/>
+			<Tool
+				Name="VCCustomBuildTool"
+			/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"
+			/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"
+			/>
+			<Tool
+				Name="VCMIDLTool"
+				PreprocessorDefinitions="NDEBUG"
+				MkTypLibCompatible="false"
+			/>
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="2"
+				EnableIntrinsicFunctions="true"
+				PreprocessorDefinitions="WIN32;_WINDOWS;NDEBUG;_USRDLL"
+				RuntimeLibrary="0"
+				EnableFunctionLevelLinking="true"
+				UsePrecompiledHeader="2"
+				WarningLevel="3"
+				DebugInformationFormat="3"
+			/>
+			<Tool
+				Name="VCManagedResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCResourceCompilerTool"
+				PreprocessorDefinitions="NDEBUG"
+				Culture="2052"
+				AdditionalIncludeDirectories="$(IntDir)"
+			/>
+			<Tool
+				Name="VCPreLinkEventTool"
+				CommandLine="rc.exe /l 0x409 /fo &quot;$(IntDir)\$(ProjectName).res&quot; /d &quot;_AUTOVERSION_&quot; /d &quot;_AFXDLL&quot; &quot;$(ProjectDir)$(ProjectName).rc_&quot;"
+			/>
+			<Tool
+				Name="VCLinkerTool"
+				LinkIncremental="1"
+				UACExecutionLevel="2"
+				ModuleDefinitionFile=".\LANShare.def"
+				GenerateDebugInformation="true"
+				SubSystem="2"
+				OptimizeReferences="2"
+				EnableCOMDATFolding="2"
+				TargetMachine="1"
+			/>
+			<Tool
+				Name="VCALinkTool"
+			/>
+			<Tool
+				Name="VCManifestTool"
+			/>
+			<Tool
+				Name="VCXDCMakeTool"
+			/>
+			<Tool
+				Name="VCBscMakeTool"
+			/>
+			<Tool
+				Name="VCFxCopTool"
+			/>
+			<Tool
+				Name="VCAppVerifierTool"
+			/>
+			<Tool
+				Name="VCPostBuildEventTool"
+			/>
+		</Configuration>
+	</Configurations>
+	<References>
+	</References>
+	<Files>
+		<Filter
+			Name="Ô´Îļþ"
+			Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
+			UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+			>
+			<File
+				RelativePath=".\LANShare.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\LANShare.def"
+				>
+			</File>
+			<File
+				RelativePath=".\stdafx.cpp"
+				>
+				<FileConfiguration
+					Name="Debug|Win32"
+					>
+					<Tool
+						Name="VCCLCompilerTool"
+						UsePrecompiledHeader="1"
+					/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="Release|Win32"
+					>
+					<Tool
+						Name="VCCLCompilerTool"
+						UsePrecompiledHeader="1"
+					/>
+				</FileConfiguration>
+			</File>
+		</Filter>
+		<Filter
+			Name="Í·Îļþ"
+			Filter="h;hpp;hxx;hm;inl;inc;xsd"
+			UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+			>
+			<File
+				RelativePath=".\LANShare.h"
+				>
+			</File>
+			<File
+				RelativePath=".\Resource.h"
+				>
+			</File>
+			<File
+				RelativePath=".\stdafx.h"
+				>
+			</File>
+			<File
+				RelativePath=".\targetver.h"
+				>
+			</File>
+		</Filter>
+		<Filter
+			Name="×ÊÔ´Îļþ"
+			Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
+			UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
+			>
+			<File
+				RelativePath=".\LANShare.rc"
+				>
+			</File>
+			<File
+				RelativePath=".\res\LANShare.rc2"
+				>
+			</File>
+		</Filter>
+		<File
+			RelativePath=".\ReadMe.txt"
+			>
+		</File>
+	</Files>
+	<Globals>
+	</Globals>
+</VisualStudioProject>

+ 44 - 0
局域网共享/LANShare/ReadMe.txt

@@ -0,0 +1,44 @@
+========================================================================
+    MICROSOFT 基础类库 : LANShare 项目概述
+========================================================================
+
+
+应用程序向导已为您创建了此 LANShare DLL。此 DLL 不仅演示 Microsoft 基础类的基本使用方法,还可作为您编写 DLL 的起点。
+
+本文件概要介绍组成 LANShare DLL 的每个文件的内容。
+
+LANShare.vcproj
+    这是使用应用程序向导生成的 VC++ 项目的主项目文件,
+    其中包含生成该文件的 Visual C++ 的版本信息,以及有关使用应用程序向导选择的平台、配置和项目功能的信息。
+
+LANShare.h
+    这是 DLL 的主头文件。它声明了 CLANShareApp 类。
+
+LANShare.cpp
+    这是主 DLL 源文件。它包含 CLANShareApp 类。
+
+LANShare.rc
+    这是程序使用的所有 Microsoft Windows 资源的列表。它包括 RES 子目录中存储的图标、位图和光标。此文件可以直接在 Microsoft Visual C++ 中进行编辑。
+
+res\LANShare.rc2
+    此文件包含不在 Microsoft Visual C++ 中进行编辑的资源。您应该将不可由资源编辑器编辑的所有资源放在此文件中。
+
+LANShare.def
+    此文件包含在 Microsoft Windows 中运行所必需的 DLL 的有关信息。它定义了 DLL 的名称和说明等参数,而且还从 DLL 导出函数。
+
+/////////////////////////////////////////////////////////////////////////////
+其他标准文件:
+
+StdAfx.h, StdAfx.cpp
+    这些文件用于生成名为 LANShare.pch 的预编译头 (PCH) 文件和名为 StdAfx.obj 的预编译类型文件。
+
+Resource.h
+    这是标准头文件,可用于定义新的资源 ID。
+    Microsoft Visual C++ 将读取并更新此文件。
+
+/////////////////////////////////////////////////////////////////////////////
+其他注释:
+
+应用程序向导使用“TODO:”来指示应添加或自定义的源代码部分。
+
+/////////////////////////////////////////////////////////////////////////////

+ 16 - 0
局域网共享/LANShare/Resource.h

@@ -0,0 +1,16 @@
+//{{NO_DEPENDENCIES}}
+// Microsoft Visual C++ generated include file.
+// Used by LANShare.rc
+//
+
+// жÔÏóµÄÏÂÒ»×éĬÈÏÖµ
+//
+#ifdef APSTUDIO_INVOKED
+#ifndef APSTUDIO_READONLY_SYMBOLS
+
+#define _APS_NEXT_RESOURCE_VALUE	1000
+#define _APS_NEXT_CONTROL_VALUE		1000
+#define _APS_NEXT_SYMED_VALUE		1000
+#define _APS_NEXT_COMMAND_VALUE		32771
+#endif
+#endif

+ 13 - 0
局域网共享/LANShare/res/LANShare.rc2

@@ -0,0 +1,13 @@
+//
+// LANShare.RC2 - Microsoft Visual C++ 不会直接编辑的资源
+//
+
+#ifdef APSTUDIO_INVOKED
+#error 此文件不能用 Microsoft Visual C++ 编辑
+#endif //APSTUDIO_INVOKED
+
+
+/////////////////////////////////////////////////////////////////////////////
+// 在此处添加手动编辑的资源...
+
+/////////////////////////////////////////////////////////////////////////////

+ 7 - 0
局域网共享/LANShare/stdafx.cpp

@@ -0,0 +1,7 @@
+// stdafx.cpp : 只包括标准包含文件的源文件
+// LANShare.pch 将作为预编译头
+// stdafx.obj 将包含预编译类型信息
+
+#include "stdafx.h"
+
+

+ 39 - 0
局域网共享/LANShare/stdafx.h

@@ -0,0 +1,39 @@
+// stdafx.h : 标准系统包含文件的包含文件,
+// 或是经常使用但不常更改的
+// 特定于项目的包含文件
+
+#pragma once
+
+#ifndef VC_EXTRALEAN
+#define VC_EXTRALEAN            // 从 Windows 头中排除极少使用的资料
+#endif
+
+#include "targetver.h"
+
+#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS      // 某些 CString 构造函数将是显式的
+
+#include <afxwin.h>         // MFC 核心组件和标准组件
+#include <afxext.h>         // MFC 扩展
+
+#ifndef _AFX_NO_OLE_SUPPORT
+#include <afxole.h>         // MFC OLE 类
+#include <afxodlgs.h>       // MFC OLE 对话框类
+#include <afxdisp.h>        // MFC 自动化类
+#endif // _AFX_NO_OLE_SUPPORT
+
+#ifndef _AFX_NO_DB_SUPPORT
+#include <afxdb.h>                      // MFC ODBC 数据库类
+#endif // _AFX_NO_DB_SUPPORT
+
+#ifndef _AFX_NO_DAO_SUPPORT
+#include <afxdao.h>                     // MFC DAO 数据库类
+#endif // _AFX_NO_DAO_SUPPORT
+
+#ifndef _AFX_NO_OLE_SUPPORT
+#include <afxdtctl.h>           // MFC 对 Internet Explorer 4 公共控件的支持
+#endif
+#ifndef _AFX_NO_AFXCMN_SUPPORT
+#include <afxcmn.h>                     // MFC 对 Windows 公共控件的支持
+#endif // _AFX_NO_AFXCMN_SUPPORT
+
+

+ 26 - 0
局域网共享/LANShare/targetver.h

@@ -0,0 +1,26 @@
+
+#pragma once
+
+// 以下宏定义要求的最低平台。要求的最低平台
+// 是具有运行应用程序所需功能的 Windows、Internet Explorer 等产品的
+// 最早版本。通过在指定版本及更低版本的平台上启用所有可用的功能,宏可以
+// 正常工作。
+
+// 如果必须要针对低于以下指定版本的平台,请修改下列定义。
+// 有关不同平台对应值的最新信息,请参考 MSDN。
+#ifndef WINVER                          // 指定要求的最低平台是 Windows Vista。
+#define WINVER 0x0600           // 将此值更改为相应的值,以适用于 Windows 的其他版本。
+#endif
+
+#ifndef _WIN32_WINNT            // 指定要求的最低平台是 Windows Vista。
+#define _WIN32_WINNT 0x0600     // 将此值更改为相应的值,以适用于 Windows 的其他版本。
+#endif
+
+#ifndef _WIN32_WINDOWS          // 指定要求的最低平台是 Windows 98。
+#define _WIN32_WINDOWS 0x0410 // 将此值更改为适当的值,以适用于 Windows Me 或更高版本。
+#endif
+
+#ifndef _WIN32_IE                       // 指定要求的最低平台是 Internet Explorer 7.0。
+#define _WIN32_IE 0x0700        // 将此值更改为相应的值,以适用于 IE 的其他版本。
+#endif
+

+ 138 - 0
局域网共享/LANShareTest/LANShareTest.cpp

@@ -0,0 +1,138 @@
+
+// LANShareTest.cpp : 定义应用程序的类行为。
+//
+
+#include "stdafx.h"
+#include "LANShareTest.h"
+#include "LANShareTestDlg.h"
+
+#ifdef _DEBUG
+#define new DEBUG_NEW
+#endif
+
+
+// CLANShareTestApp
+
+BEGIN_MESSAGE_MAP(CLANShareTestApp, CWinAppEx)
+	ON_COMMAND(ID_HELP, &CWinApp::OnHelp)
+END_MESSAGE_MAP()
+
+
+// CLANShareTestApp 构造
+
+CLANShareTestApp::CLANShareTestApp()
+{
+	// TODO: 在此处添加构造代码,
+	// 将所有重要的初始化放置在 InitInstance 中
+}
+
+
+// 唯一的一个 CLANShareTestApp 对象
+
+CLANShareTestApp theApp;
+
+
+// CLANShareTestApp 初始化
+
+BOOL CLANShareTestApp::InitInstance()
+{
+	// 如果一个运行在 Windows XP 上的应用程序清单指定要
+	// 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,
+	//则需要 InitCommonControlsEx()。否则,将无法创建窗口。
+	INITCOMMONCONTROLSEX InitCtrls;
+	InitCtrls.dwSize = sizeof(InitCtrls);
+	// 将它设置为包括所有要在应用程序中使用的
+	// 公共控件类。
+	InitCtrls.dwICC = ICC_WIN95_CLASSES;
+	InitCommonControlsEx(&InitCtrls);
+
+	CWinAppEx::InitInstance();
+
+	AfxEnableControlContainer();
+
+#if 0
+	//////////////////////////////////////////////////////////////////////////
+	AllocConsole();                             // 开辟控制台;
+	SetConsoleTitle(_T("lyfz调试输出"));		// 设置控制台窗口标题;
+	freopen("CONOUT$", "w+t", stdout);			// 重定向输出;
+	freopen("CONIN$", "r+t", stdin);			// 重定向输入;
+
+	HWND hWnd = NULL;
+again:
+	hWnd = ::FindWindow(NULL, _T("lyfz调试输出"));
+	if( hWnd )
+	{
+		if (!::SetWindowPos(hWnd, HWND_TOPMOST, 0,0,0,0, SWP_NOMOVE | SWP_NOSIZE)) 
+		{
+			_tprintf_s(_T("前置设置失败\n"));
+		}
+		else
+		{
+			_tprintf_s(_T("前置设置成功\n"));
+		}
+	}
+	else
+	{
+		goto again;
+	}
+#endif
+
+	if ( LanShareDll::LoadLANShareLibrary() )
+	{
+#if 0
+		TCHAR szN8ViewShareName[MAX_PATH] = {0};
+		if ( API_IsTheDirectoryShared(_T("D:\\360Windows10"), szN8ViewShareName, MAX_PATH) )
+		{
+			AfxMessageBox(_T("目录已共享"));
+			return FALSE;
+		}
+
+		if ( !LanShareDll::API_AddShareDirectory(_T("D:\\360Windows10"), _T("测试共享")) )
+		{
+			AfxMessageBox(_T("设置共享失败"));
+			return FALSE;
+		}
+
+		if ( !LanShareDll::API_SetNetShareSecurity(_T("测试共享"), _T("Everyone")))
+		{
+			AfxMessageBox(_T("设置共享权限失败"));
+			return FALSE;
+		}
+
+		if ( !LanShareDll::API_AddAccessRights(_T("D:\\利亚方舟经典版\\服务器"), _T("Everyone")))
+		{
+			AfxMessageBox(_T("设置安全权限失败"));
+			return FALSE;
+		}
+
+		LanShareDll::FreeLANShareLibrary();
+#endif
+	}
+
+	// 标准初始化
+	// 如果未使用这些功能并希望减小
+	// 最终可执行文件的大小,则应移除下列
+	// 不需要的特定初始化例程
+	// 更改用于存储设置的注册表项
+	// TODO: 应适当修改该字符串,
+	// 例如修改为公司或组织名
+	SetRegistryKey(_T("应用程序向导生成的本地应用程序"));
+
+	CLANShareTestDlg dlg;
+	m_pMainWnd = &dlg;
+	INT_PTR nResponse = dlg.DoModal();
+	if (nResponse == IDOK)
+	{
+		// TODO: 在此放置处理何时用
+		//  “确定”来关闭对话框的代码
+	}
+	else if (nResponse == IDCANCEL)
+	{
+		// TODO: 在此放置处理何时用
+		//  “取消”来关闭对话框的代码
+	}
+
+	// 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序,
+	//  而不是启动应用程序的消息泵。
+	return FALSE;
+}

+ 32 - 0
局域网共享/LANShareTest/LANShareTest.h

@@ -0,0 +1,32 @@
+
+// LANShareTest.h : PROJECT_NAME 应用程序的主头文件
+//
+
+#pragma once
+
+#ifndef __AFXWIN_H__
+	#error "在包含此文件之前包含“stdafx.h”以生成 PCH 文件"
+#endif
+
+#include "resource.h"		// 主符号
+
+
+// CLANShareTestApp:
+// 有关此类的实现,请参阅 LANShareTest.cpp
+//
+
+class CLANShareTestApp : public CWinAppEx
+{
+public:
+	CLANShareTestApp();
+
+// 重写
+	public:
+	virtual BOOL InitInstance();
+
+// 实现
+
+	DECLARE_MESSAGE_MAP()
+};
+
+extern CLANShareTestApp theApp;

+ 209 - 0
局域网共享/LANShareTest/LANShareTest.rc

@@ -0,0 +1,209 @@
+// Microsoft Visual C++ generated resource script.
+//
+#include "resource.h"
+
+#define APSTUDIO_READONLY_SYMBOLS
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 2 resource.
+//
+#ifndef APSTUDIO_INVOKED
+#include "targetver.h"
+#endif
+#include "afxres.h"
+
+/////////////////////////////////////////////////////////////////////////////
+#undef APSTUDIO_READONLY_SYMBOLS
+
+/////////////////////////////////////////////////////////////////////////////
+// 中文(中华人民共和国) resources
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)
+#ifdef _WIN32
+LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED
+#pragma code_page(936)
+#endif //_WIN32
+
+#ifdef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// TEXTINCLUDE
+//
+
+1 TEXTINCLUDE 
+BEGIN
+    "resource.h\0"
+END
+
+2 TEXTINCLUDE 
+BEGIN
+    "#ifndef APSTUDIO_INVOKED\r\n"
+    "#include ""targetver.h""\r\n"
+    "#endif\r\n"
+    "#include ""afxres.h""\r\n"
+    "\0"
+END
+
+3 TEXTINCLUDE 
+BEGIN
+    "#define _AFX_NO_SPLITTER_RESOURCES\r\n"
+    "#define _AFX_NO_OLE_RESOURCES\r\n"
+    "#define _AFX_NO_TRACKER_RESOURCES\r\n"
+    "#define _AFX_NO_PROPERTY_RESOURCES\r\n"
+    "\r\n"
+    "#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)\r\n"
+    "LANGUAGE 4, 2\r\n"
+    "#pragma code_page(936)\r\n"
+    "#include ""res\\LANShareTest.rc2""  // 非 Microsoft Visual C++ 编辑的资源\r\n"
+    "#include ""l.CHS\\afxres.rc""      // 标准组件\r\n"
+    "#endif\r\n"
+    "\0"
+END
+
+#endif    // APSTUDIO_INVOKED
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Icon
+//
+
+// Icon with lowest ID value placed first to ensure application icon
+// remains consistent on all systems.
+IDR_MAINFRAME           ICON                    "res\\LANShareTest.ico"
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Dialog
+//
+
+IDD_ABOUTBOX DIALOGEX 0, 0, 170, 62
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
+CAPTION "关于 LANShareTest"
+FONT 9, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+    ICON            IDR_MAINFRAME,IDC_STATIC,14,14,21,20
+    LTEXT           "LANShareTest,1.0 版",IDC_STATIC,42,14,114,8,SS_NOPREFIX
+    LTEXT           "Copyright (C) 2016",IDC_STATIC,42,26,114,8
+    DEFPUSHBUTTON   "确定",IDOK,113,41,50,14,WS_GROUP
+END
+
+IDD_LANSHARETEST_DIALOG DIALOGEX 0, 0, 320, 200
+STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
+EXSTYLE WS_EX_APPWINDOW
+CAPTION "LANShareTest"
+FONT 9, "MS Shell Dlg", 0, 0, 0x1
+BEGIN
+    DEFPUSHBUTTON   "确定",IDOK,209,179,50,14
+    PUSHBUTTON      "取消",IDCANCEL,263,179,50,14
+    EDITTEXT        ET_DIR,9,12,250,14,ES_AUTOHSCROLL
+    PUSHBUTTON      "选择目录共享",BTN_OPENDIR,261,12,50,14
+    PUSHBUTTON      "设置共享",IDC_BUTTON2,156,31,50,14
+    PUSHBUTTON      "删除共享",IDC_BUTTON3,208,31,50,14
+    PUSHBUTTON      "everyone权限",IDC_BUTTON4,260,31,50,14
+    EDITTEXT        ET_SHARENAME,39,31,116,14,ES_AUTOHSCROLL
+    LTEXT           "共享名:",IDC_STATIC,10,33,28,8
+END
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Version
+//
+
+VS_VERSION_INFO VERSIONINFO
+ FILEVERSION 1,0,0,1
+ PRODUCTVERSION 1,0,0,1
+ FILEFLAGSMASK 0x3fL
+#ifdef _DEBUG
+ FILEFLAGS 0x1L
+#else
+ FILEFLAGS 0x0L
+#endif
+ FILEOS 0x4L
+ FILETYPE 0x1L
+ FILESUBTYPE 0x0L
+BEGIN
+    BLOCK "StringFileInfo"
+    BEGIN
+        BLOCK "080403a8"
+        BEGIN
+            VALUE "CompanyName", "TODO: <公司名>"
+            VALUE "FileDescription", "TODO: <文件说明>"
+            VALUE "FileVersion", "1.0.0.1"
+            VALUE "InternalName", "LANShareTest.exe"
+            VALUE "LegalCopyright", "TODO: (C) <公司名>。保留所有权利。"
+            VALUE "OriginalFilename", "LANShareTest.exe"
+            VALUE "ProductName", "TODO: <产品名>"
+            VALUE "ProductVersion", "1.0.0.1"
+        END
+    END
+    BLOCK "VarFileInfo"
+    BEGIN
+        VALUE "Translation", 0x804, 936
+    END
+END
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// DESIGNINFO
+//
+
+#ifdef APSTUDIO_INVOKED
+GUIDELINES DESIGNINFO 
+BEGIN
+    IDD_ABOUTBOX, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 163
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 55
+    END
+
+    IDD_LANSHARETEST_DIALOG, DIALOG
+    BEGIN
+        LEFTMARGIN, 7
+        RIGHTMARGIN, 313
+        TOPMARGIN, 7
+        BOTTOMMARGIN, 193
+    END
+END
+#endif    // APSTUDIO_INVOKED
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// String Table
+//
+
+STRINGTABLE 
+BEGIN
+    IDS_ABOUTBOX            "关于 LANShareTest(&A)..."
+END
+
+#endif    // 中文(中华人民共和国) resources
+/////////////////////////////////////////////////////////////////////////////
+
+
+
+#ifndef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 3 resource.
+//
+#define _AFX_NO_SPLITTER_RESOURCES
+#define _AFX_NO_OLE_RESOURCES
+#define _AFX_NO_TRACKER_RESOURCES
+#define _AFX_NO_PROPERTY_RESOURCES
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)
+LANGUAGE 4, 2
+#pragma code_page(936)
+#include "res\LANShareTest.rc2"  // 非 Microsoft Visual C++ 编辑的资源
+#include "l.CHS\afxres.rc"      // 标准组件
+#endif
+
+/////////////////////////////////////////////////////////////////////////////
+#endif    // not APSTUDIO_INVOKED
+

+ 282 - 0
局域网共享/LANShareTest/LANShareTest.vcproj

@@ -0,0 +1,282 @@
+<?xml version="1.0" encoding="gb2312"?>
+<VisualStudioProject
+	ProjectType="Visual C++"
+	Version="9.00"
+	Name="LANShareTest"
+	ProjectGUID="{2D8A0D50-5988-4B95-A3E2-69B5BC3C15EB}"
+	RootNamespace="LANShareTest"
+	Keyword="MFCProj"
+	TargetFrameworkVersion="196613"
+	>
+	<Platforms>
+		<Platform
+			Name="Win32"
+		/>
+	</Platforms>
+	<ToolFiles>
+	</ToolFiles>
+	<Configurations>
+		<Configuration
+			Name="Debug|Win32"
+			OutputDirectory="..\..\..\bin\$(SolutionName)"
+			IntermediateDirectory="$(OutDir)\$(ProjectName)\$(ConfigurationName)"
+			ConfigurationType="1"
+			UseOfMFC="2"
+			CharacterSet="2"
+			>
+			<Tool
+				Name="VCPreBuildEventTool"
+			/>
+			<Tool
+				Name="VCCustomBuildTool"
+			/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"
+			/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"
+			/>
+			<Tool
+				Name="VCMIDLTool"
+				PreprocessorDefinitions="_DEBUG"
+				MkTypLibCompatible="false"
+				ValidateParameters="true"
+			/>
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="0"
+				PreprocessorDefinitions="WIN32;_WINDOWS;_DEBUG"
+				MinimalRebuild="true"
+				BasicRuntimeChecks="3"
+				RuntimeLibrary="3"
+				UsePrecompiledHeader="2"
+				WarningLevel="3"
+				DebugInformationFormat="4"
+			/>
+			<Tool
+				Name="VCManagedResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCResourceCompilerTool"
+				PreprocessorDefinitions="_DEBUG"
+				Culture="2052"
+				AdditionalIncludeDirectories="$(IntDir)"
+			/>
+			<Tool
+				Name="VCPreLinkEventTool"
+			/>
+			<Tool
+				Name="VCLinkerTool"
+				LinkIncremental="2"
+				UACExecutionLevel="2"
+				GenerateDebugInformation="true"
+				SubSystem="2"
+				TargetMachine="1"
+			/>
+			<Tool
+				Name="VCALinkTool"
+			/>
+			<Tool
+				Name="VCManifestTool"
+			/>
+			<Tool
+				Name="VCXDCMakeTool"
+			/>
+			<Tool
+				Name="VCBscMakeTool"
+			/>
+			<Tool
+				Name="VCFxCopTool"
+			/>
+			<Tool
+				Name="VCAppVerifierTool"
+			/>
+			<Tool
+				Name="VCPostBuildEventTool"
+			/>
+		</Configuration>
+		<Configuration
+			Name="Release|Win32"
+			OutputDirectory="..\..\..\bin\$(SolutionName)"
+			IntermediateDirectory="$(OutDir)\$(ProjectName)\$(ConfigurationName)"
+			ConfigurationType="1"
+			UseOfMFC="1"
+			CharacterSet="2"
+			WholeProgramOptimization="1"
+			>
+			<Tool
+				Name="VCPreBuildEventTool"
+			/>
+			<Tool
+				Name="VCCustomBuildTool"
+			/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"
+			/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"
+			/>
+			<Tool
+				Name="VCMIDLTool"
+				PreprocessorDefinitions="NDEBUG"
+				MkTypLibCompatible="false"
+				ValidateParameters="true"
+			/>
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="2"
+				EnableIntrinsicFunctions="true"
+				PreprocessorDefinitions="WIN32;_WINDOWS;NDEBUG"
+				MinimalRebuild="false"
+				RuntimeLibrary="0"
+				EnableFunctionLevelLinking="true"
+				UsePrecompiledHeader="2"
+				WarningLevel="3"
+				DebugInformationFormat="3"
+			/>
+			<Tool
+				Name="VCManagedResourceCompilerTool"
+			/>
+			<Tool
+				Name="VCResourceCompilerTool"
+				PreprocessorDefinitions="NDEBUG"
+				Culture="2052"
+				AdditionalIncludeDirectories="$(IntDir)"
+			/>
+			<Tool
+				Name="VCPreLinkEventTool"
+			/>
+			<Tool
+				Name="VCLinkerTool"
+				LinkIncremental="1"
+				UACExecutionLevel="2"
+				GenerateDebugInformation="true"
+				SubSystem="2"
+				OptimizeReferences="2"
+				EnableCOMDATFolding="2"
+				TargetMachine="1"
+			/>
+			<Tool
+				Name="VCALinkTool"
+			/>
+			<Tool
+				Name="VCManifestTool"
+			/>
+			<Tool
+				Name="VCXDCMakeTool"
+			/>
+			<Tool
+				Name="VCBscMakeTool"
+			/>
+			<Tool
+				Name="VCFxCopTool"
+			/>
+			<Tool
+				Name="VCAppVerifierTool"
+			/>
+			<Tool
+				Name="VCPostBuildEventTool"
+			/>
+		</Configuration>
+	</Configurations>
+	<References>
+	</References>
+	<Files>
+		<Filter
+			Name="Ô´Îļþ"
+			Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
+			UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
+			>
+			<File
+				RelativePath=".\LanShareDll.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\LANShareTest.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\LANShareTestDlg.cpp"
+				>
+			</File>
+			<File
+				RelativePath=".\stdafx.cpp"
+				>
+				<FileConfiguration
+					Name="Debug|Win32"
+					>
+					<Tool
+						Name="VCCLCompilerTool"
+						UsePrecompiledHeader="1"
+					/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="Release|Win32"
+					>
+					<Tool
+						Name="VCCLCompilerTool"
+						UsePrecompiledHeader="1"
+					/>
+				</FileConfiguration>
+			</File>
+		</Filter>
+		<Filter
+			Name="Í·Îļþ"
+			Filter="h;hpp;hxx;hm;inl;inc;xsd"
+			UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
+			>
+			<File
+				RelativePath=".\LanShareDll.h"
+				>
+			</File>
+			<File
+				RelativePath=".\LANShareTest.h"
+				>
+			</File>
+			<File
+				RelativePath=".\LANShareTestDlg.h"
+				>
+			</File>
+			<File
+				RelativePath=".\Resource.h"
+				>
+			</File>
+			<File
+				RelativePath=".\stdafx.h"
+				>
+			</File>
+			<File
+				RelativePath=".\targetver.h"
+				>
+			</File>
+		</Filter>
+		<Filter
+			Name="×ÊÔ´Îļþ"
+			Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
+			UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
+			>
+			<File
+				RelativePath=".\res\LANShareTest.ico"
+				>
+			</File>
+			<File
+				RelativePath=".\LANShareTest.rc"
+				>
+			</File>
+			<File
+				RelativePath=".\res\LANShareTest.rc2"
+				>
+			</File>
+		</Filter>
+		<File
+			RelativePath=".\ReadMe.txt"
+			>
+		</File>
+	</Files>
+	<Globals>
+		<Global
+			Name="RESOURCE_FILE"
+			Value="LANShareTest.rc"
+		/>
+	</Globals>
+</VisualStudioProject>

+ 288 - 0
局域网共享/LANShareTest/LANShareTestDlg.cpp

@@ -0,0 +1,288 @@
+
+// LANShareTestDlg.cpp : 实现文件
+//
+
+#include "stdafx.h"
+#include "LANShareTest.h"
+#include "LANShareTestDlg.h"
+
+#ifdef _DEBUG
+#define new DEBUG_NEW
+#endif
+
+
+// 用于应用程序“关于”菜单项的 CAboutDlg 对话框
+
+class CAboutDlg : public CDialog
+{
+public:
+	CAboutDlg();
+
+// 对话框数据
+	enum { IDD = IDD_ABOUTBOX };
+
+	protected:
+	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持
+
+// 实现
+protected:
+	DECLARE_MESSAGE_MAP()
+};
+
+CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
+{
+}
+
+void CAboutDlg::DoDataExchange(CDataExchange* pDX)
+{
+	CDialog::DoDataExchange(pDX);
+}
+
+BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
+END_MESSAGE_MAP()
+
+
+// CLANShareTestDlg 对话框
+
+
+
+
+CLANShareTestDlg::CLANShareTestDlg(CWnd* pParent /*=NULL*/)
+	: CDialog(CLANShareTestDlg::IDD, pParent)
+{
+	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
+}
+
+void CLANShareTestDlg::DoDataExchange(CDataExchange* pDX)
+{
+	CDialog::DoDataExchange(pDX);
+}
+
+BEGIN_MESSAGE_MAP(CLANShareTestDlg, CDialog)
+	ON_WM_SYSCOMMAND()
+	ON_WM_PAINT()
+	ON_WM_QUERYDRAGICON()
+	//}}AFX_MSG_MAP
+	ON_BN_CLICKED(BTN_OPENDIR, &CLANShareTestDlg::OnBnClickedOpendir)
+	ON_BN_CLICKED(IDC_BUTTON2, &CLANShareTestDlg::OnBnClickedButton2)
+	ON_BN_CLICKED(IDC_BUTTON4, &CLANShareTestDlg::OnBnClickedButton4)
+	ON_BN_CLICKED(IDC_BUTTON3, &CLANShareTestDlg::OnBnClickedButton3)
+END_MESSAGE_MAP()
+
+
+// CLANShareTestDlg 消息处理程序
+
+BOOL CLANShareTestDlg::OnInitDialog()
+{
+	CDialog::OnInitDialog();
+
+	// 将“关于...”菜单项添加到系统菜单中。
+
+	// IDM_ABOUTBOX 必须在系统命令范围内。
+	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
+	ASSERT(IDM_ABOUTBOX < 0xF000);
+
+	CMenu* pSysMenu = GetSystemMenu(FALSE);
+	if (pSysMenu != NULL)
+	{
+		BOOL bNameValid;
+		CString strAboutMenu;
+		bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
+		ASSERT(bNameValid);
+		if (!strAboutMenu.IsEmpty())
+		{
+			pSysMenu->AppendMenu(MF_SEPARATOR);
+			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
+		}
+	}
+
+	// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
+	//  执行此操作
+	SetIcon(m_hIcon, TRUE);			// 设置大图标
+	SetIcon(m_hIcon, FALSE);		// 设置小图标
+
+	// TODO: 在此添加额外的初始化代码
+
+	return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
+}
+
+void CLANShareTestDlg::OnSysCommand(UINT nID, LPARAM lParam)
+{
+	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
+	{
+		CAboutDlg dlgAbout;
+		dlgAbout.DoModal();
+	}
+	else
+	{
+		CDialog::OnSysCommand(nID, lParam);
+	}
+}
+
+// 如果向对话框添加最小化按钮,则需要下面的代码
+//  来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
+//  这将由框架自动完成。
+
+void CLANShareTestDlg::OnPaint()
+{
+	if (IsIconic())
+	{
+		CPaintDC dc(this); // 用于绘制的设备上下文
+
+		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
+
+		// 使图标在工作区矩形中居中
+		int cxIcon = GetSystemMetrics(SM_CXICON);
+		int cyIcon = GetSystemMetrics(SM_CYICON);
+		CRect rect;
+		GetClientRect(&rect);
+		int x = (rect.Width() - cxIcon + 1) / 2;
+		int y = (rect.Height() - cyIcon + 1) / 2;
+
+		// 绘制图标
+		dc.DrawIcon(x, y, m_hIcon);
+	}
+	else
+	{
+		CDialog::OnPaint();
+	}
+}
+
+//当用户拖动最小化窗口时系统调用此函数取得光标
+//显示。
+HCURSOR CLANShareTestDlg::OnQueryDragIcon()
+{
+	return static_cast<HCURSOR>(m_hIcon);
+}
+
+static INT CALLBACK BrowseCallbackProc(HWND hwnd, UINT uMsg, LPARAM lp, LPARAM pData)
+{
+	switch (uMsg)
+	{
+	case BFFM_INITIALIZED:
+		SendMessage(hwnd, BFFM_SETSELECTION, TRUE, NULL);
+		break;
+	case   BFFM_SELCHANGED:
+		{
+			TCHAR szFileName[MAX_PATH];
+			LPITEMIDLIST pidlCurrent = (LPITEMIDLIST)lp;
+			SHGetPathFromIDList(pidlCurrent, szFileName);
+			SendMessage(hwnd, BFFM_SETSTATUSTEXT, 0, (LPARAM)szFileName);
+		}
+		break;
+		// 这个不能让默认目录为桌面;
+		// 	case BFFM_INITIALIZED:
+		// 		{
+		// 			// WParam is TRUE since you are passing a path.
+		// 			// It would be FALSE if you were passing a pidl.
+		// 			TCHAR szDir[MAX_PATH] = { 0 };
+		// 			GetCurrentDirectory(sizeof(szDir) / sizeof(TCHAR), szDir);
+		// 			SendMessage(hwnd, BFFM_SETSELECTION, TRUE, (LPARAM)szDir);
+		// 		}
+		// 		break;
+	}
+	return 0;
+}
+
+BOOL GetFilePath(OUT TCHAR *FilePath, IN HWND hParentWnd, IN TCHAR* InstructionString, IN UINT ulFlags)
+{
+	BROWSEINFO bInfo;
+	LPITEMIDLIST pidl, pidlDesktop;
+	ZeroMemory((PVOID)&bInfo, sizeof(BROWSEINFO));
+
+	HRESULT hr = SHGetSpecialFolderLocation(NULL, CSIDL_DESKTOP, &pidlDesktop);
+	if ( hr != S_OK )
+	{
+		return FALSE;
+	}
+
+	bInfo.pidlRoot = pidlDesktop;
+	bInfo.hwndOwner = hParentWnd;
+	bInfo.pszDisplayName = FilePath;
+	bInfo.lpszTitle = InstructionString;
+	bInfo.ulFlags = ulFlags;
+	bInfo.lpfn = BrowseCallbackProc;
+	bInfo.lParam = 0;
+
+	if ((pidl = ::SHBrowseForFolder(&bInfo)) == NULL)    
+	{
+		return FALSE;
+	}
+
+	if (::SHGetPathFromIDList(pidl, FilePath) == FALSE)   
+	{
+		return FALSE;
+	}
+
+	return TRUE;
+}
+
+void CLANShareTestDlg::OnBnClickedOpendir()
+{
+	TCHAR szImgSourceDirectory[MAX_PATH] = {0};
+	if ( GetFilePath(szImgSourceDirectory, ::GetActiveWindow(), _T("请选择源相片的文件夹!"), BIF_USENEWUI | BIF_RETURNFSANCESTORS | BIF_RETURNONLYFSDIRS))
+	{
+		SetDlgItemText(ET_DIR, szImgSourceDirectory);
+	}
+}
+
+void CLANShareTestDlg::OnBnClickedButton2()
+{
+	CString strDir;
+	CString strShareName;
+
+	GetDlgItemText(ET_DIR, strDir);
+	GetDlgItemText(ET_SHARENAME, strShareName);
+	if ( API_IsTheDirectoryShared(strDir, strShareName.GetString(), MAX_PATH) )
+	{
+		AfxMessageBox(_T("目录已共享"));
+		return ;
+	}
+
+	if ( !LanShareDll::API_AddShareDirectory(strDir, strShareName) )
+	{
+		AfxMessageBox(_T("设置共享失败"));
+		return ;
+	}
+	else
+		AfxMessageBox(_T("设置共享成功"));
+
+}
+
+void CLANShareTestDlg::OnBnClickedButton4()
+{
+	CString strDir;
+	CString strShareName;
+
+	GetDlgItemText(ET_DIR, strDir);
+	GetDlgItemText(ET_SHARENAME, strShareName);
+
+	if ( !LanShareDll::API_SetNetShareSecurity(strShareName, _T("Everyone")))
+	{
+		AfxMessageBox(_T("设置共享权限失败"));
+		return ;
+	}else
+		AfxMessageBox(_T("设置共享权限成功"));
+
+	if ( !LanShareDll::API_AddAccessRights(strDir, _T("Everyone")))
+	{
+		AfxMessageBox(_T("设置安全权限失败"));
+		return ;
+	}else
+		AfxMessageBox(_T("设置安全权限成功"));
+}
+
+void CLANShareTestDlg::OnBnClickedButton3()
+{
+	CString strDir;
+	CString strShareName;
+
+	GetDlgItemText(ET_DIR, strDir);
+	GetDlgItemText(ET_SHARENAME, strShareName);
+	if ( !LanShareDll::API_DelShareDirectory(strShareName))
+	{
+		AfxMessageBox(_T("删除共享失败"));
+		return ;
+	}else
+		AfxMessageBox(_T("删除共享成功"));
+}

+ 37 - 0
局域网共享/LANShareTest/LANShareTestDlg.h

@@ -0,0 +1,37 @@
+
+// LANShareTestDlg.h : 头文件
+//
+
+#pragma once
+
+
+// CLANShareTestDlg 对话框
+class CLANShareTestDlg : public CDialog
+{
+// 构造
+public:
+	CLANShareTestDlg(CWnd* pParent = NULL);	// 标准构造函数
+
+// 对话框数据
+	enum { IDD = IDD_LANSHARETEST_DIALOG };
+
+	protected:
+	virtual void DoDataExchange(CDataExchange* pDX);	// DDX/DDV 支持
+
+
+// 实现
+protected:
+	HICON m_hIcon;
+
+	// 生成的消息映射函数
+	virtual BOOL OnInitDialog();
+	afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
+	afx_msg void OnPaint();
+	afx_msg HCURSOR OnQueryDragIcon();
+	DECLARE_MESSAGE_MAP()
+public:
+	afx_msg void OnBnClickedOpendir();
+	afx_msg void OnBnClickedButton2();
+	afx_msg void OnBnClickedButton4();
+	afx_msg void OnBnClickedButton3();
+};

+ 157 - 0
局域网共享/LANShareTest/LanShareDll.cpp

@@ -0,0 +1,157 @@
+#include "StdAfx.h"
+#include "LanShareDll.h"
+
+namespace LanShareDll
+{
+	HMODULE g_hLANShareDLL = NULL;
+	DisConnectSession g_DisConnectSession = NULL;
+	DelShareDirectoryW g_DelShareDirectoryW = NULL;
+	DelShareDirectoryA g_DelShareDirectoryA = NULL;
+	IsTheDirectorySharedW g_IsTheDirectorySharedW = NULL;
+	IsTheDirectorySharedA g_IsTheDirectorySharedA = NULL;
+	AccessShareDirectory g_AccessShareDirectory = NULL;
+	AddShareDirectoryW g_AddShareDirectoryW = NULL;
+	AddShareDirectoryA g_AddShareDirectoryA = NULL;
+	SetNetShareSecurity g_SetNetShareSecurity = NULL;
+	AddAccessRights g_AddAccessRights = NULL;
+
+	BOOL LoadLANShareLibrary()
+	{
+		if (g_hLANShareDLL == NULL)
+			g_hLANShareDLL = LoadLibrary(_T("LANShare.dll"));
+
+		if (g_hLANShareDLL == NULL)
+		{
+			AfxMessageBox(_T("加载LANShare模块失败!"));
+			return FALSE;
+		}
+
+		g_DisConnectSession = (DisConnectSession)::GetProcAddress(g_hLANShareDLL, "DisConnectSession");
+		g_DelShareDirectoryW = (DelShareDirectoryW)::GetProcAddress(g_hLANShareDLL, "DelShareDirectoryW");
+		g_DelShareDirectoryA = (DelShareDirectoryA)::GetProcAddress(g_hLANShareDLL, "DelShareDirectoryA");
+		g_IsTheDirectorySharedW = (IsTheDirectorySharedW)::GetProcAddress(g_hLANShareDLL, "IsTheDirectorySharedW");
+		g_IsTheDirectorySharedA = (IsTheDirectorySharedA)::GetProcAddress(g_hLANShareDLL, "IsTheDirectorySharedA");
+		g_AccessShareDirectory = (AccessShareDirectory)::GetProcAddress(g_hLANShareDLL, "AccessShareDirectory");
+		g_AddShareDirectoryW = (AddShareDirectoryW)::GetProcAddress(g_hLANShareDLL, "AddShareDirectoryW");
+		g_AddShareDirectoryA = (AddShareDirectoryA)::GetProcAddress(g_hLANShareDLL, "AddShareDirectoryA");
+		g_SetNetShareSecurity = (SetNetShareSecurity)::GetProcAddress(g_hLANShareDLL, "SetNetShareSecurity");
+		g_AddAccessRights = (AddAccessRights)::GetProcAddress(g_hLANShareDLL, "AddAccessRights");
+
+
+		return TRUE;
+	}
+
+	void FreeLANShareLibrary()
+	{
+		if (g_hLANShareDLL)
+		{
+			if ( !FreeLibrary(g_hLANShareDLL) )
+			{
+				_tprintf_s(_T("释放LANShare.dll失败,%d\n"), GetLastError());
+			}
+		}
+
+		g_hLANShareDLL = NULL;
+
+		g_DisConnectSession = NULL;
+		g_DelShareDirectoryW = NULL;
+		g_DelShareDirectoryA = NULL;
+		g_IsTheDirectorySharedW = NULL;
+		g_IsTheDirectorySharedA = NULL;
+		g_AccessShareDirectory = NULL;
+		g_AddShareDirectoryW = NULL;
+		g_AddShareDirectoryA = NULL;
+		g_SetNetShareSecurity = NULL;
+		g_AddAccessRights = NULL;
+	}
+
+	BOOL API_DisConnectSession( IN LPCTSTR lpHostAddr )
+	{
+		if ( g_DisConnectSession )
+			return g_DisConnectSession(lpHostAddr);
+		else
+			_tprintf_s(_T("加载DisConnectSession函数失败\n"));
+
+		return FALSE;
+	}
+
+	BOOL API_DelShareDirectory( IN LPCTSTR lpShareName )
+	{
+#ifdef UNICODE
+		if ( g_DelShareDirectoryW )
+			return g_DelShareDirectoryW(lpShareName);
+#else
+		if ( g_DelShareDirectoryA )
+			return g_DelShareDirectoryA(lpShareName);
+#endif
+		else
+			_tprintf_s(_T("加载DelShareDirectory函数失败\n"));
+
+		return FALSE;
+	}
+
+	BOOL API_IsTheDirectoryShared(IN LPCTSTR lpDirectory, OUT LPCTSTR lpShareName /* = NULL  */, IN const INT& nBufLen /* = 0 */ )
+	{
+		if ( lpShareName == NULL || lpDirectory == NULL )
+			return FALSE;
+
+		TCHAR *pszShareName = new TCHAR[nBufLen];
+		memcpy(pszShareName, lpShareName, _tcslen(lpShareName)*sizeof(TCHAR));
+#ifdef UNICODE
+		if ( g_IsTheDirectorySharedW )
+			return g_IsTheDirectorySharedW(lpDirectory, pszShareName, nBufLen);
+#else
+		if ( g_IsTheDirectorySharedA )
+			return g_IsTheDirectorySharedA(lpDirectory, pszShareName, nBufLen);
+#endif
+		else
+			_tprintf_s(_T("加载IsTheDirectoryShared函数失败\n"));
+
+		return FALSE;
+	}
+
+	BOOL API_AccessShareDirectory(IN LPCTSTR lpUserName, IN LPCTSTR lpPasswd, IN LPCTSTR lpShareDirectory)
+	{
+		if ( g_AccessShareDirectory )
+			return g_AccessShareDirectory(lpUserName, lpPasswd, lpShareDirectory);
+		else
+			_tprintf_s(_T("加载AccessShareDirectory函数失败\n"));
+
+		return FALSE;
+	}
+
+	BOOL API_AddShareDirectory(IN LPCTSTR lpDirectory, IN LPCTSTR lpShareName)
+	{
+#ifdef UNICODE
+		if ( g_AddShareDirectoryW )
+			return g_AddShareDirectoryW(lpDirectory, lpShareName);
+#else
+		if ( g_AddShareDirectoryA )
+			return g_AddShareDirectoryA(lpDirectory, lpShareName);
+#endif
+		else
+			_tprintf_s(_T("加载AddShareDirectory函数失败\n"));
+
+		return FALSE;
+	}
+
+	BOOL API_SetNetShareSecurity(IN LPCTSTR lpShareName, IN LPCTSTR lpUsser, IN const DWORD& dwPermissions /* = STANDARD_RIGHTS_ALL| SPECIFIC_RIGHTS_ALL */ )
+	{
+		if ( g_SetNetShareSecurity )
+			return g_SetNetShareSecurity(lpShareName, lpUsser, dwPermissions);
+		else
+			_tprintf_s(_T("加载SetNetShareSecurity函数失败\n"));
+
+		return FALSE;
+	}
+
+	BOOL API_AddAccessRights(IN LPCTSTR lpszFileName, IN LPCTSTR lpszAccountName, IN const DWORD& dwAccessMask /* = STANDARD_RIGHTS_ALL| SPECIFIC_RIGHTS_ALL */ )
+	{
+		if ( g_AddAccessRights )
+			return g_AddAccessRights(lpszFileName, lpszAccountName, dwAccessMask);
+		else
+			_tprintf_s(_T("加载AddAccessRights函数失败\n"));
+
+		return FALSE;
+	}
+};

+ 49 - 0
局域网共享/LANShareTest/LanShareDll.h

@@ -0,0 +1,49 @@
+/************************************************************************/
+/*  Copyright (C), 2016-2020, [IT], 保留所有权利;
+/*  模 块 名:;
+/*  描    述:;
+/*
+/*  版    本:[V];	
+/*  作    者:[IT];
+/*  日    期:[5/15/2016];
+/*
+/*
+/*  注    意:;
+/*
+/*  修改记录:[IT];
+/*  修改日期:;
+/*  修改版本:;
+/*  修改内容:;
+/************************************************************************/
+#ifndef __LAN_SHARE__
+#define __LAN_SHARE__
+
+#pragma once
+
+typedef INT (WINAPI *DisConnectSession)( IN LPCTSTR lpHostAddr );
+typedef INT (WINAPI *DelShareDirectoryW)( IN LPCWSTR lpShareName );
+typedef INT (WINAPI *DelShareDirectoryA)( IN LPCCH lpShareName );
+typedef INT (WINAPI *IsTheDirectorySharedW)( IN LPCWSTR lpDirectory, OUT LPWSTR lpShareName, IN const INT& nBufLen );
+typedef INT (WINAPI *IsTheDirectorySharedA)( IN LPCCH lpDirectory, OUT LPCH lpShareName, IN const INT& nBufLen );
+typedef INT (WINAPI *AccessShareDirectory)( IN LPCTSTR lpUserName, IN LPCTSTR lpPasswd, IN LPCTSTR lpShareDirectory );
+typedef INT (WINAPI *AddShareDirectoryW)( IN LPCWSTR lpDirectory, IN LPCWSTR lpShareName );
+typedef INT (WINAPI *AddShareDirectoryA)( IN LPCCH lpDirectory, IN LPCCH lpShareName );
+typedef INT (WINAPI *SetNetShareSecurity)( IN LPCTSTR lpShareName, IN LPCTSTR lpUsser, IN const DWORD& dwPermissions  /*= STANDARD_RIGHTS_ALL| SPECIFIC_RIGHTS_ALL */);
+typedef INT (WINAPI *AddAccessRights)( IN LPCTSTR lpszFileName, IN LPCTSTR lpszAccountName, IN const DWORD& dwAccessMask /* = STANDARD_RIGHTS_ALL| SPECIFIC_RIGHTS_ALL */);
+
+
+namespace LanShareDll
+{
+	BOOL LoadLANShareLibrary();
+	void FreeLANShareLibrary();
+
+	BOOL API_DisConnectSession( IN LPCTSTR lpHostAddr );
+	BOOL API_DelShareDirectory( IN LPCTSTR lpShareName );
+	BOOL API_IsTheDirectoryShared(IN LPCTSTR lpDirectory, OUT LPCTSTR lpShareName  = NULL , IN const INT& nBufLen  = 0  );
+	BOOL API_AccessShareDirectory(IN LPCTSTR lpUserName, IN LPCTSTR lpPasswd, IN LPCTSTR lpShareDirectory);
+	BOOL API_AddShareDirectory(IN LPCTSTR lpDirectory, IN LPCTSTR lpShareName);
+	BOOL API_SetNetShareSecurity(IN LPCTSTR lpShareName, IN LPCTSTR lpUsser, IN const DWORD& dwPermissions  = STANDARD_RIGHTS_ALL| SPECIFIC_RIGHTS_ALL );
+	BOOL API_AddAccessRights(IN LPCTSTR lpszFileName, IN LPCTSTR lpszAccountName, IN const DWORD& dwAccessMask  = STANDARD_RIGHTS_ALL| SPECIFIC_RIGHTS_ALL );
+};
+
+#endif

+ 66 - 0
局域网共享/LANShareTest/ReadMe.txt

@@ -0,0 +1,66 @@
+================================================================================
+    MICROSOFT 基础类库: LANShareTest 项目概述
+===============================================================================
+
+应用程序向导已为您创建此 LANShareTest 应用程序。此应用程序不仅演示使用 Microsoft 基础类的基本知识,而且可作为编写应用程序的起点。
+
+此文件包含组成 LANShareTest 应用程序的各个文件的内容摘要。
+
+LANShareTest.vcproj
+    这是使用应用程序向导生成的 VC++ 项目的主项目文件。
+    它包含有关生成文件的 Visual C++ 版本的信息,以及有关使用应用程序向导选择的平台、配置和项目功能的信息。
+
+LANShareTest.h
+    这是应用程序的主要头文件。它包括其他项目特定的头文件(包括 Resource.h),并声明 CLANShareTestApp 应用程序类。
+
+LANShareTest.cpp
+    这是包含应用程序类 CLANShareTestApp 的主要应用程序源文件。
+
+LANShareTest.rc
+    这是程序使用的所有 Microsoft Windows 资源的列表。它包括 RES 子目录中存储的图标、位图和光标。此文件可以直接在 Microsoft Visual C++ 中进行编辑。项目资源位于 2052 中。
+
+res\LANShareTest.ico
+    这是用作应用程序图标的图标文件。此图标包括在主要资源文件 LANShareTest.rc 中。
+
+res\LANShareTest.rc2
+    此文件包含不是由 Microsoft Visual C++ 编辑的资源。您应该将不可由资源编辑器编辑的所有资源放在此文件中。
+
+
+/////////////////////////////////////////////////////////////////////////////
+
+应用程序向导创建一个对话框类:
+
+LANShareTestDlg.h,LANShareTestDlg.cpp - 对话框
+    这些文件包含 CLANShareTestDlg 类。该类定义应用程序主对话框的行为。该对话框的模板位于 LANShareTest.rc 中,该文件可以在 Microsoft Visual C++ 中进行编辑。
+
+
+/////////////////////////////////////////////////////////////////////////////
+
+其他功能:
+
+ActiveX 控件
+    应用程序包括对使用 ActiveX 控件的支持。
+
+/////////////////////////////////////////////////////////////////////////////
+
+其他标准文件:
+
+StdAfx.h, StdAfx.cpp
+    这些文件用于生成名为 LANShareTest.pch 的预编译头(PCH)文件和名为 StdAfx.obj 的预编译类型文件。
+
+Resource.h
+    这是标准头文件,它定义新资源 ID。
+    Microsoft Visual C++ 将读取并更新此文件。
+
+LANShareTest.manifest
+	Windows XP 使用应用程序清单文件描述应用程序	对特定版本并行程序集的依赖性。加载程序使用此	信息从程序集缓存加载相应程序集或	从应用程序加载私有信息。应用程序清单可能作为	与应用程序可执行文件安装在同一文件夹中的外部 .manifest 文件包括在内以便重新发布,	也可能以资源的形式包括在该可执行文件中。
+/////////////////////////////////////////////////////////////////////////////
+
+其他注释:
+
+应用程序向导使用“TODO:”指示应添加或自定义的源代码部分。
+
+如果应用程序在共享 DLL 中使用 MFC,则将需要重新发布 MFC DLL。如果应用程序所用与操作系统的区域设置不同,则也将必须重新发布对应的本地化资源 MFC90XXX.DLL。
+有关这两个主题的详细信息,请参阅 MSDN 文档中有关重新发布 Visual C++ 应用程序的部分。
+
+/////////////////////////////////////////////////////////////////////////////

+ 27 - 0
局域网共享/LANShareTest/Resource.h

@@ -0,0 +1,27 @@
+//{{NO_DEPENDENCIES}}
+// Microsoft Visual C++ generated include file.
+// Used by LANShareTest.rc
+//
+#define IDM_ABOUTBOX                    0x0010
+#define IDD_ABOUTBOX                    100
+#define IDS_ABOUTBOX                    101
+#define IDD_LANSHARETEST_DIALOG         102
+#define IDR_MAINFRAME                   128
+#define ET_DIR                          1000
+#define BTN_OPENDIR                     1001
+#define IDC_BUTTON2                     1002
+#define IDC_BUTTON3                     1003
+#define IDC_BUTTON4                     1004
+#define IDC_EDIT1                       1005
+#define ET_SHARENAME                    1005
+
+// Next default values for new objects
+// 
+#ifdef APSTUDIO_INVOKED
+#ifndef APSTUDIO_READONLY_SYMBOLS
+#define _APS_NEXT_RESOURCE_VALUE        129
+#define _APS_NEXT_COMMAND_VALUE         32771
+#define _APS_NEXT_CONTROL_VALUE         1006
+#define _APS_NEXT_SYMED_VALUE           101
+#endif
+#endif

BIN=BIN
局域网共享/LANShareTest/res/LANShareTest.ico


+ 13 - 0
局域网共享/LANShareTest/res/LANShareTest.rc2

@@ -0,0 +1,13 @@
+//
+// LANShareTest.RC2 - Microsoft Visual C++ 不会直接编辑的资源
+//
+
+#ifdef APSTUDIO_INVOKED
+#error 此文件不能用 Microsoft Visual C++ 编辑
+#endif //APSTUDIO_INVOKED
+
+
+/////////////////////////////////////////////////////////////////////////////
+// 在此处添加手动编辑的资源...
+
+/////////////////////////////////////////////////////////////////////////////

+ 52 - 0
局域网共享/LANShareTest/stdafx.cpp

@@ -0,0 +1,52 @@
+
+// stdafx.cpp : 只包括标准包含文件的源文件
+// LANShareTest.pch 将作为预编译头
+// stdafx.obj 将包含预编译类型信息
+
+#include "stdafx.h"
+
+/*
+DisConnectSession g_DisConnectSession = NULL;
+IsTheDirectoryShared g_IsTheDirectoryShared = NULL;
+AccessShareDirectory g_AccessShareDirectory = NULL;
+AddShareDirectory g_AddShareDirectory = NULL;
+SetNetShareSecurity g_SetNetShareSecurity = NULL;
+AddAccessRights g_AddAccessRights = NULL;
+
+
+BOOL LoadLANShareLibrary()
+{
+	if (g_hLANShareDLL == NULL)
+		g_hLANShareDLL = LoadLibrary(_T("LANShare.dll"));
+
+	if (g_hLANShareDLL == NULL)
+	{
+		AfxMessageBox(_T("加载LANShare模块失败!"));
+		return FALSE;
+	}
+
+	g_DisConnectSession = (DisConnectSession)::GetProcAddress(g_hLANShareDLL, "DisConnectSession");
+	g_IsTheDirectoryShared = (IsTheDirectoryShared)::GetProcAddress(g_hLANShareDLL, "IsTheDirectoryShared");
+	g_AccessShareDirectory = (AccessShareDirectory)::GetProcAddress(g_hLANShareDLL, "AccessShareDirectory");
+	g_AddShareDirectory = (AddShareDirectory)::GetProcAddress(g_hLANShareDLL, "AddShareDirectory");
+	g_SetNetShareSecurity = (SetNetShareSecurity)::GetProcAddress(g_hLANShareDLL, "SetNetShareSecurity");
+	g_AddAccessRights = (AddAccessRights)::GetProcAddress(g_hLANShareDLL, "AddAccessRights");
+
+	
+	return TRUE;
+}
+
+void FreeLANShareLibrary()
+{
+	if (g_hLANShareDLL)
+		FreeLibrary(g_hLANShareDLL);
+
+	g_DisConnectSession = NULL;
+	g_IsTheDirectoryShared = NULL;
+	g_AccessShareDirectory = NULL;
+	g_AddShareDirectory = NULL;
+	g_SetNetShareSecurity = NULL;
+	g_AddAccessRights = NULL;
+
+}
+*/

+ 80 - 0
局域网共享/LANShareTest/stdafx.h

@@ -0,0 +1,80 @@
+
+// stdafx.h : 标准系统包含文件的包含文件,
+// 或是经常使用但不常更改的
+// 特定于项目的包含文件
+
+#pragma once
+
+#ifndef _SECURE_ATL
+#define _SECURE_ATL 1
+#endif
+
+#ifndef VC_EXTRALEAN
+#define VC_EXTRALEAN            // 从 Windows 头中排除极少使用的资料
+#endif
+
+#include "targetver.h"
+
+#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS      // 某些 CString 构造函数将是显式的
+
+// 关闭 MFC 对某些常见但经常可放心忽略的警告消息的隐藏
+#define _AFX_ALL_WARNINGS
+
+#include <afxwin.h>         // MFC 核心组件和标准组件
+#include <afxext.h>         // MFC 扩展
+
+
+#include <afxdisp.h>        // MFC 自动化类
+
+
+
+#ifndef _AFX_NO_OLE_SUPPORT
+#include <afxdtctl.h>           // MFC 对 Internet Explorer 4 公共控件的支持
+#endif
+#ifndef _AFX_NO_AFXCMN_SUPPORT
+#include <afxcmn.h>             // MFC 对 Windows 公共控件的支持
+#endif // _AFX_NO_AFXCMN_SUPPORT
+
+#include <afxcontrolbars.h>     // 功能区和控件条的 MFC 支持
+
+/*
+HMODULE g_hLANShareDLL = NULL;
+
+
+typedef INT (WINAPI *DisConnectSession)( IN LPCTSTR lpHostAddr );
+typedef INT (WINAPI *IsTheDirectoryShared)( IN LPCTSTR lpDirectory, OUT LPTSTR lpShareName , IN const INT& nBufLen );
+typedef INT (WINAPI *AccessShareDirectory)( IN LPCTSTR lpUserName, IN LPCTSTR lpPasswd, IN LPCTSTR lpShareDirectory );
+typedef INT (WINAPI *AddShareDirectory)( IN LPCTSTR lpDirectory, IN LPCTSTR lpShareName );
+typedef INT (WINAPI *SetNetShareSecurity)( IN LPCTSTR lpShareName, IN LPCTSTR lpUsser, IN const DWORD& dwPermissions );
+typedef INT (WINAPI *AddAccessRights)( IN LPCTSTR lpszFileName, IN LPCTSTR lpszAccountName, IN const DWORD& dwAccessMask );
+
+
+extern DisConnectSession g_DisConnectSession ;
+extern IsTheDirectoryShared g_IsTheDirectoryShared ;
+extern AccessShareDirectory g_AccessShareDirectory ;
+extern AddShareDirectory g_AddShareDirectory ;
+extern SetNetShareSecurity g_SetNetShareSecurity ;
+extern AddAccessRights g_AddAccessRights ;
+
+extern BOOL LoadLANShareLibrary();
+extern void FreeLANShareLibrary();
+
+*/
+
+
+#include "LanShareDll.h"
+using namespace LanShareDll;
+
+#ifdef _UNICODE
+#if defined _M_IX86
+#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"")
+#elif defined _M_IA64
+#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='ia64' publicKeyToken='6595b64144ccf1df' language='*'\"")
+#elif defined _M_X64
+#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df' language='*'\"")
+#else
+#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
+#endif
+#endif
+
+

+ 26 - 0
局域网共享/LANShareTest/targetver.h

@@ -0,0 +1,26 @@
+
+#pragma once
+
+// 以下宏定义要求的最低平台。要求的最低平台
+// 是具有运行应用程序所需功能的 Windows、Internet Explorer 等产品的
+// 最早版本。通过在指定版本及更低版本的平台上启用所有可用的功能,宏可以
+// 正常工作。
+
+// 如果必须要针对低于以下指定版本的平台,请修改下列定义。
+// 有关不同平台对应值的最新信息,请参考 MSDN。
+#ifndef WINVER                          // 指定要求的最低平台是 Windows Vista。
+#define WINVER 0x0600           // 将此值更改为相应的值,以适用于 Windows 的其他版本。
+#endif
+
+#ifndef _WIN32_WINNT            // 指定要求的最低平台是 Windows Vista。
+#define _WIN32_WINNT 0x0600     // 将此值更改为相应的值,以适用于 Windows 的其他版本。
+#endif
+
+#ifndef _WIN32_WINDOWS          // 指定要求的最低平台是 Windows 98。
+#define _WIN32_WINDOWS 0x0410 // 将此值更改为适当的值,以适用于 Windows Me 或更高版本。
+#endif
+
+#ifndef _WIN32_IE                       // 指定要求的最低平台是 Internet Explorer 7.0。
+#define _WIN32_IE 0x0700        // 将此值更改为相应的值,以适用于 IE 的其他版本。
+#endif
+