• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 349
  • Last Modified:

How to Convert from Local to UNC path?

I can see how to do this using a MAPI command that may or may not be supported in the future. How is this supposed to be handled. I'm getting a file name and path back from a CFileDialog. I want this to be in a UNC format. I'm using MSVC++ 5.
0
maknight
Asked:
maknight
  • 6
  • 5
1 Solution
 
jkrCommented:
Use 'WNetGetConnection()' to achieve this. From the docs:

"WNetGetConnection  
The WNetGetConnection function retrieves the name of the network resource associated with a local device.

DWORD WNetGetConnection( LPCTSTR lpLocalName,
 // pointer to local name
 
LPTSTR lpRemoteName,
 // pointer to buffer for remote name
 
LPDWORD lpnLength
 // pointer to buffer size, in characters
 
);
 


Parameters
lpLocalName

Points to a null-terminated string that specifies the name of the local device to get the network name for.

lpRemoteName

Points to a buffer that receives the null-terminated remote name used to make the connection.

lpnLength

Points to a variable that specifies the size, in characters, of the buffer pointed to by the lpRemoteName parameter. If the function fails because the buffer is not big enough, this parameter returns the required buffer size.

Return Values
If the function succeeds, the return value is NO_ERROR.

If the function fails, the return value is an error code. To get extended error information, call GetLastError. GetLastError may return one of the following error codes: Value
 Meaning
 
ERROR_BAD_DEVICE
 The string pointed to by the lpLocalName parameter is invalid.
 
ERROR_NOT_CONNECTED
 The device specified by lpLocalName is not redirected.
 
ERROR_MORE_DATA
 The buffer is too small. The lpnLength parameter points to a variable that contains the required buffer size. More entries are available with subsequent calls.
 
ERROR_CONNECTION_UNAVAIL
 The device is not currently connected, but it is a persistent connection.
 
ERROR_NO_NETWORK
 No network is present.
 
ERROR_EXTENDED_ERROR
 A network-specific error occurred. To get a description of the error, use the WNetGetLastError function.
 
ERROR_NO_NET_OR_BAD_PATH
 None of the providers recognized this local name as having a connection. However, the network is not available for at least one provider to whom the connection may belong.
 


The WNetGetConnection function returns error codes for compatibility with Windows version 3.1. For compatibility with the Win32 API, the function also sets the error code value returned by GetLastError."

Once you have the network name for a drive/share, you can simply append the relative path of your file to the network name to obtain the full UNC name...

Feel free to ask if you need more information!
0
 
maknightAuthor Commented:
According to the docs, this only works on WinNT. I develop on WinNT, but all the systems that will actually use the program run Win95. I saw this one.
0
 
jkrCommented:
Hmm, that's from the VC5 docs:

WNetGetConnection
 
Windows NT
 Yes
 
Win95
 Yes
 
Win32s
 Yes
 
Import Library
 mpr.lib
 
Header File
 winnetwk.h
 
Unicode
 WinNT
 
Platform Notes
 None
 
It only says that the UNICODE version is available on NT only...
0
Upgrade your Question Security!

Your question, your audience. Choose who sees your identity—and your question—with question security.

 
maknightAuthor Commented:
I'll give it a shot. Here's what on my VC5 online docs:

WNetGetUniversalName
Windows NT
 Yes
Win95
 No
Win32s
 No
Import Library
 mpr.lib
Header File
 winnetwk.h
Unicode
 WinNT
Platform Notes
 None
0
 
jkrCommented:
That's REALLY strange - I copied the above from the VC5 online docs, too...

BTW: A 3rd opinion ;-)

http://msdn.microsoft.com/library/sdkdoc/network/networks_84a6.htm

"Remarks
Windows NT/Windows 2000: If the network connection was made using the Microsoft LAN Manager network, and the calling application is running in a different logon session than the application that made the connection, a call to the WNetGetConnection function for the associated local device will fail. The function fails with ERROR_NOT_CONNECTED or ERROR_CONNECTION_UNAVAIL. This is because a connection made using Microsoft LAN Manager is visible only to applications running in the same logon session as the application that made the connection. (To prevent the call to WNetGetConnection from failing it is not sufficient for the application to be running in the user account that created the connection.)

Requirements
  Windows NT/2000: Requires Windows NT 3.1 or later.
  Windows 95/98: Requires Windows 95 or later.
  Windows CE: Requires version 2.0 or later.
  Header: Declared in winnetwk.h.
  Import Library: Use mpr.lib.
  Unicode: Implemented as Unicode and ANSI versions on Windows NT/2000."
0
 
maknightAuthor Commented:
OK. How in the world do I use this LPVOID thing?
0
 
jkrCommented:
Err - which LPVOID?
0
 
jkrCommented:
Hmm, this API is intended to be used like this:

char acNetName[MAX_PATH];
DWORD dwSize = MAX_PATH;
char* pszLocalName="C:\\";

WNetGetConnection(  pszLocalName, acNetName, &dwSize);
0
 
maknightAuthor Commented:
Got It! I increased the points too. Thanks for the assistance.
0
 
maknightAuthor Commented:
BTW: I was looking at WNetGetUniversalName, and not WNetGetConnection. That's why we were not synced up very well with the documentation.
0
 
jkrCommented:
Ooops, this explains a lot ;-)

Thanx!
0

Featured Post

Learn to develop an Android App

Want to increase your earning potential in 2018? Pad your resume with app building experience. Learn how with this hands-on course.

  • 6
  • 5
Tackle projects and never again get stuck behind a technical roadblock.
Join Now