最近由于项目需求,需要编写一个监控本机共享文件夹的变化的模块,经过查询资料,找到并实现了一个较为稳定的方式
项目实现是使用Win32 C++的,测试平台是Win 7 64和Win 10 64,XP测试也是好使的。下面是具体实现
首先要获取并监控系统共享文件夹的路径,相关注册表路径为 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\LanmanServer\Share ,他的值的格式为如图所示,
类型为 REG_MULTI_SZ, 所以我们需要枚举获取所有类型为REG_MULTI_SZ的项。然后它的值的具体内容如图所示,
我们可以看的项为Path=E:\ShareTest 里就有我们所需要的共享文件夹路径,所以获取共享文件夹路径的就可以开始编写了,具体实现如下。
BOOL GetSharedFoldersList(map<CString, HANDLE> &theList)
{
BOOL bFlag = FALSE;
HKEY hKey = NULL;
do
{
//清空列表
theList.clear();
//HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\LanmanServer\Share
//通过注册表获取共享文件夹列表
HKEY rootKey = REG_SHARE_KEY;
CString szRegPath = REG_SHARE_PATH;
int ErrCode;
if (ERROR_SUCCESS != (ErrCode = RegOpenKeyEx(rootKey, szRegPath, 0, KEY_READ | KEY_WOW64_64KEY, &hKey)))
{
break;
}
TCHAR szValue[MAX_VALUE_NAME] = { 0 };
DWORD dwValueSize = MAX_VALUE_NAME;
int index = 0;
DWORD dwBufferSize = 255;
DWORD dwType;
TCHAR *szValBuffer = NULL;
DWORD dwSize;
while (ERROR_NO_MORE_ITEMS != RegEnumValue (
hKey, index, szValue, &dwValueSize, NULL, &dwType, NULL, &dwBufferSize))
{
//判断值类型
switch(dwType)
{
//只找多个串的值
case REG_MULTI_SZ:
{
dwSize = dwBufferSize + 1;
szValBuffer = new TCHAR[dwSize];
ZeroMemory(szValBuffer, dwSize);
if (ERROR_SUCCESS != RegQueryValueEx(hKey, szValue, 0, &dwType, (LPBYTE)szValBuffer, &dwBufferSize))
{
break;
}
int j = 0;