C++ NetShareEnum(..)winapi无法删除不必要的共享文件夹

C++ NetShareEnum(..)winapi无法删除不必要的共享文件夹,c++,winapi,visual-c++,mfc,shared-directory,C++,Winapi,Visual C++,Mfc,Shared Directory,为了获取共享文件夹名称,我使用了以下代码,在这里我可以获取文件夹名称。但我面临的问题是,用户创建的共享文件夹也会提供一些额外的文件夹,我不知道如何防止程序隐藏不必要的文件夹名称。就像在我的例子中,我得到了“cc\u视图”(用于clearcase)和“用户”文件夹,我想从文件夹列表中删除它们 我写了以下代码,请帮助获得正确的输出 #ifndef UNICODE #define UNICODE #endif #include <windows.h> #i

为了获取共享文件夹名称,我使用了以下代码,在这里我可以获取文件夹名称。但我面临的问题是,用户创建的共享文件夹也会提供一些额外的文件夹,我不知道如何防止程序隐藏不必要的文件夹名称。就像在我的例子中,我得到了“cc\u视图”(用于clearcase)和“用户”文件夹,我想从文件夹列表中删除它们

我写了以下代码,请帮助获得正确的输出

 #ifndef UNICODE
    #define UNICODE
    #endif
    #include <windows.h>
    #include <stdio.h>
    #include <lm.h>
    #pragma comment(lib, "Netapi32.lib")
    #pragma comment(lib, "Advapi32.lib")

    void wmain( int argc, TCHAR *lpszArgv[ ])
    {
       PSHARE_INFO_502 BufPtr,p;
       NET_API_STATUS res;
       LPTSTR   lpszServer = NULL;
       DWORD er=0,tr=0,resume=0, i;

       switch(argc)
       {
       case 2:
          lpszServer = lpszArgv[1];
          break;
       default:
          printf("Usage: NetShareEnum <servername>\n");
          //return;
       }
       //
       // Print a report header.
       //
       printf("ShareFolderName\n");
   printf("---------------\n");
       //
       // Call the NetShareEnum function; specify level 502.
       //
       do // begin do
       {
          res = NetShareEnum ((LPSTR)lpszServer, 502, (LPBYTE *) &BufPtr, MAX_PREFERRED_LENGTH, &er, &tr, &resume);
          //
          // If the call succeeds,
          //
          if(res == ERROR_SUCCESS || res == ERROR_MORE_DATA)
          {
             p=BufPtr;
             //
             // Loop through the entries;
             //  print retrieved data.
             //
             for(i=1;i<=er;i++)
             {
                 LPCTSTR str = (LPCTSTR)p->shi502_remark;
                 if(!(lstrcmpi(str,L"Remote admin")==0 ||lstrcmpi(str, L"Remote IPC")==0 || lstrcmpi(str,L"Default share")==0)) //Help in removing from extra folder based on the remarks
                    printf("%-20S%\n",p->shi502_netname);
                p++;
             }
             //
             // Free the allocated buffer.
             //
             NetApiBufferFree(BufPtr);
          }
          else 
             printf("Error: %ld\n",res);
       }
       // Continue to call NetShareEnum while 
       //  there are more entries. 
       // 
       while (res==ERROR_MORE_DATA); // end do
       return;
    }
#ifndef UNICODE
#定义UNICODE
#恩迪夫
#包括
#包括
#包括
#pragma注释(lib,“Netapi32.lib”)
#pragma注释(lib,“Advapi32.lib”)
void wmain(int argc,TCHAR*lpszArgv[])
{
PSHARE_INFO_502 BufPtr,p;
净API状态资源;
LPTSTR lpszServer=NULL;
德沃德er=0,tr=0,resume=0,i;
开关(argc)
{
案例2:
lpszServer=lpszArgv[1];
打破
违约:
printf(“用法:NetShareEnum\n”);
//返回;
}
//
//打印报告标题。
//
printf(“ShareFolderName\n”);
printf(“-------------\n”);
//
//调用NetShareEnum函数;指定级别502。
//
开始做
{
res=NetShareEnum((LPSTR)lpszServer,502,(LPBYTE*)&BufPtr,最大优先长度,&er,&tr,&resume);
//
//如果呼叫成功,
//
如果(res==ERROR|u SUCCESS | res==ERROR_MORE_DATA)
{
p=BufPtr;
//
//循环浏览条目;
//打印检索到的数据。
//
对于(i=1;ishi502_备注;
如果(!(lstrcmpi(str,L“远程管理”)==0 | | lstrcmpi(str,L“远程IPC”)==0 | | lstrcmpi(str,L“默认共享”)==0))//根据备注从额外文件夹中删除的帮助
printf(“%-20S%\n”,p->shi502\u网络名);
p++;
}
//
//释放分配的缓冲区。
//
NetapipBufferFree(BufPtr);
}
其他的
printf(“错误:%ld\n”,res);
}
//继续调用NetShareEnum,同时
//有更多的条目。
// 
while(res==ERROR\u MORE\u DATA);//结束do
返回;
}

只需在此处的列表中添加要排除的值:

if(!(lstrcmpi(str,L"Remote admin")==0 ||
     lstrcmpi(str, L"Remote IPC")==0 || 
     lstrcmpi(str,L"Default share")==0 ||
     lstrcmpi(str,L"cc_views")==0 ||
     lstrcmpi(str,L"Users")==0))
       printf("%-20S%\n",p->shi502_netname);

您不应该需要像
(LPSTR)这样的强制转换
。如果没有强制转换,代码无法编译,编译器会提醒您应该解决的问题。例如Unicode/ANSI不匹配。将该强制转换从传递给
NetShareEnum
的第一个参数中去掉。我们是否可以对函数本身进行任何更改,以便它将过滤所有我不想要的名称或所有这些内容我必须像你上面所做的那样手动完成什么?这是可能的。你可以有一个配置文件,其中包含你想要筛选的所有共享名,或者只是程序中的一个硬编码列表。这取决于你希望你的程序有多灵活以及列表更改的频率。你能告诉我一些参考资料来添加我从上面得到的结果吗在Windows资源管理器上下文菜单中编程,以便我可以在此共享文件夹上执行某些操作。