如何利用NetShareEnum將網路路徑轉換為本地路徑

來源:互聯網
上載者:User

#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);
 }

}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.