Scott Marcus
marcus at tsstech.com
Fri May 7 10:11:30 CDT 2004
Cut and paste from a web page (needs some editing/rework)... Option Explicit Private Declare Function WNetGetConnection Lib _ "mpr.dll" Alias "WNetGetConnectionA" (ByVal _ lpszLocalName As String, ByVal _ lpszRemoteName As String, cbRemoteName As _ Long) As Long Private Const NO_ERROR = 0 Private Const ERROR_BAD_DEVICE = 1200& Private Const ERROR_NOT_CONNECTED = 2250& Private Const ERROR_MORE_DATA = 234 Private Const ERROR_CONNECTION_UNAVAIL = 1201& Private Const ERROR_NO_NETWORK = 1222& Private Const ERROR_EXTENDED_ERROR = 1208& Private Const ERROR_NO_NET_OR_BAD_PATH = 1203& Private Sub Form_Click() Dim d As Integer Dim sRet As String Dim Msg As String For d = Asc("C") To Asc("Z") sRet = DriveLetterToUNC(Chr(d)) If Len(sRet) Then Msg = Msg & Chr(d) & ": --> " _ & sRet & vbCrLf End If Next d MsgBox Msg, , "Mapped Drives..." End Sub Private Function DriveLetterToUNC(ByVal _ DriveLetter As String) As String Dim nRet As Long Dim Drv As String Dim Buffer As String Dim BufLen As Long Const MAX_PATH = 260 If Len(DriveLetter) Then ' massage input string and create buffer Drv = UCase(Left(DriveLetter, 1)) & ":" Buffer = Space(MAX_PATH) BufLen = Len(Buffer) ' attempt to get UNC info nRet = WNetGetConnection(Drv, Buffer, _ BufLen) If nRet = ERROR_MORE_DATA Then ' increase buffer and call again Buffer = Space(BufLen) nRet = WNetGetConnection(Drv, _ Buffer, BufLen) End If If nRet = NO_ERROR Then ' return UNC name by trimming at ' first null DriveLetterToUNC = Left(Buffer, _ InStr(Buffer, vbNullChar) - 1) Else ' optionally output debugging info... Select Case nRet Case ERROR_BAD_DEVICE Debug.Print Drv; " --> "; Debug.Print "The specified " & _ "device name is invalid." Case ERROR_NOT_CONNECTED Debug.Print Drv; " --> "; Debug.Print "This network " & _ "connection does not exist." Case ERROR_CONNECTION_UNAVAIL Debug.Print Drv; ' --> "; Debug.Print "The device is " & _ "not currently connected " & _ "but it is a remembered " & _ "connection." Case ERROR_NO_NETWORK Debug.Print "The network is " & _ "not present or not started." Case ERROR_MORE_DATA Debug.Print "Buffer is too " & _ "small!" Case ERROR_EXTENDED_ERROR Debug.Print "An error has " & _ "occurred, call " & _ "WNetGetLastError." Case Else Debug.Print "Unknown error " & _ "code: "; nRet End Select End If End If End Function Scott Marcus TSS Technologies, Inc. marcus at tsstech.com (513) 772-7000 -----Original Message----- From: accessd-bounces at databaseadvisors.com [mailto:accessd-bounces at databaseadvisors.com] On Behalf Of Mitsules, Mark S. (Newport News) Sent: Friday, May 07, 2004 10:45 AM To: 'Access Developers discussion and problem solving' Subject: RE: [AccessD] Linked Tables - UNC Path I was assuming that because the linked table manager visually shows the links with drive letters and NOT UNC naming then the links were actually hard coded to a particular drive letter. Are you saying that, by default, they are in fact utilizing UNC naming internally? Because, while perusing my modules I found one last instance where I'd neglected to use my constant (which uses UNC). Perhaps it was this last oversight that was giving me the "path not found" problem all along? Mark -----Original Message----- From: Gustav Brock [mailto:gustav at cactus.dk] Sent: Friday, May 07, 2004 10:32 AM To: Access Developers discussion and problem solving Subject: Re: [AccessD] Linked Tables - UNC Path Hi Mark > Lol. I apologize...I think you're making the assumption that I have > existing relinking code already in place... Indeed, yes! > I don't:( This my first time at a TRULY multi-user app. Maybe I > need to be walked through this, but the built-in linked table > manager appears to use drive-letter mappings, not UNC. Follow the advice of Steve. > If I deploy the front-end to a person who doesn't have the same drive-letter > mappings, I get an error. > What I was looking for was an approach that > (1)mimics published relinking code, such as > http://www.mvps.org/access/tables/tbl0009.htm, > (2)forces UNC naming, yet > (3)doesn't include possible user intervention. That would be an "automatic" relinker but it wouldn't know where to find your backend except if you supply the (UNC) path within the application. If you relink using UNC path before deployment, this step should not be needed at all. /gustav > Hmmm .. I'm not sure I can follow you here - if you have the UNC path > it doesn't matter wether the user has a drive mapped to it or not. You > just need to relink with the UNC path. But why relink if you have > deployed the app linked to the UNC path of your choice? > /gustav >> Actually my situation is just the opposite. I know the remote server name, >> but the user may have that drive mapped to any letter. Therefore I would >> like to be able to relink automatically using UNC. I am not comfortable >> with the user manually choosing the location of the BE. -- _______________________________________________ AccessD mailing list AccessD at databaseadvisors.com http://databaseadvisors.com/mailman/listinfo/accessd Website: http://www.databaseadvisors.com -- _______________________________________________ AccessD mailing list AccessD at databaseadvisors.com http://databaseadvisors.com/mailman/listinfo/accessd Website: http://www.databaseadvisors.com