如何利用NetShareEnum将网络路径转换为本地路径

#ifndef UNICODE
#define UNICODE
#endif

#include <windows.h>
#include <stdio.h>
#include <lm.h>

#include <shlwapi.h>

#pragma comment(lib, "shlwapi.lib")

#pragma comment(lib, "Netapi32.lib")
#pragma comment(lib, "Advapi32.lib")

WCHAR *GetWstrFromAstr(LMSTR szSrc)
{
 int i = 0;
 int j = 0;
 WCHAR *szDes = NULL;
 printf("szSrc:%S\n", szSrc);

 j = strlen( szSrc ) + 1; 
 i = MultiByteToWideChar 
  ( 
  CP_ACP, 
  0, 
  szSrc, 
  j, 
  NULL, 
  0 
  ); 
 if ( 0 == i ) 
 { 
  return NULL;
 } 
 szDes = ( WCHAR * ) new WCHAR[i]; 
 if ( NULL == szDes ) 
 { 
  return NULL;
 } 
 RtlZeroMemory(szDes, sizeof((i)*sizeof(WCHAR)));
 if ( 0 == MultiByteToWideChar 
  ( 
  CP_ACP, 
  0, 
  szSrc, 
  j, 
  szDes, 
  i 
  ) ) 
 { 
  delete [] szDes;
  szDes = NULL;
  return NULL; 
 }
 printf("WCHAR:%ws\n", szDes);
 return szDes; 
}

#define NET_SHARE_ENUM_TYPE 502
BOOL GetLocalPathFromSharedPath(TCHAR *szSrv, TCHAR *lpszShared, TCHAR *lpszLocal)
{
 PSHARE_INFO_502 BufPtr,p;
 NET_API_STATUS res;
 LPTSTR   lpszServer = NULL;
 DWORD er=0,tr=0,resume=0, i;

 if (lpszShared == NULL ||
  lpszLocal == NULL)
 {
  return FALSE;
 }
 
 do
 {
  res = NetShareEnum (szSrv, NET_SHARE_ENUM_TYPE, (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 (StrCmpI(lpszShared, (WCHAR *)(p->shi502_netname)) == 0)
    {
     StringCchCopy(lpszLocal, MAX_PATH, (WCHAR *)(p->shi502_path));
     NetApiBufferFree(BufPtr);
     return TRUE;
    }
    p++;
   }
   
   NetApiBufferFree(BufPtr);
  }
 }while (res==ERROR_MORE_DATA); 
 return FALSE;
}

BOOL GetLocalPathFromSharedPath(TCHAR *lpszShared, TCHAR *lpszLocal)
{
 PSHARE_INFO_502 BufPtr,p;
 NET_API_STATUS res;
 LPTSTR   lpszServer = NULL;
 DWORD er=0,tr=0,resume=0, i;
 
 do
 {
  res = NetShareEnum ((char*)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++)
   {
    printf("%-20S%-30S\n",p->shi502_netname, p->shi502_path);

    if (wcscmp(lpszShared, (WCHAR *)(p->shi502_netname)) == 0)
    {
     wcscpy(lpszLocal, (WCHAR *)(p->shi502_path));
     NetApiBufferFree(BufPtr);
     return TRUE;
    }
    p++;
   }

   NetApiBufferFree(BufPtr);
  }
 }while (res==ERROR_MORE_DATA); 
 return FALSE;
}

void main()
{

 WCHAR *szShared = L"\\\\127.0.0.1\\print$\\user\\ffffff\\desktop\\";

 WCHAR szLocal[MAX_PATH] = {0};
 WCHAR szShare[MAX_PATH] = {0};
 WCHAR *p = szShared;
 WCHAR *pStart = NULL;
 WCHAR *pEnd = NULL;
 DWORD cnt = 0;
 while(*p != L'\0')
 {
  if (*p == L'\\')
  {
   cnt++;
   if (cnt == 3)
   {
    pStart = p;
   }
   if (cnt == 4)
   {
    pEnd = p;
    break;
   }
  }
  p++;
 }
 if (pStart && pEnd)
 {
  StrCpyN(szShare, pStart+1, (static_cast<int>(pEnd-pStart)));
  printf("szShare:%ws\n", szShare);
 }
 if (GetLocalPathFromSharedPath(szShare, szLocal))
 {
  PathAppend(szLocal, pEnd+1);
  printf("Local:%ws\n", szLocal);
 }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值