Page 1 of 1

Fallo con la función WNetGetConnection()

Posted: Tue Dec 02, 2008 1:14 am
by cuatecatl82
Saludos a toda la comunidad:.

Resulta que me encuentro haciendo pruebas con conecciones mediante redes locales y en una parte del código uso esta funcion, resulta que necesito saber el valor y la longitud que ésta devuelve, pero siempre es del tipo caracter y con longitud de 249, aunque la unidad a examinar sea local o en red:

Aki el fragmento de código... :arrow:

Code: Select all

Function TipoRed()

LOCAL   cRuta:= GetModuleFilename(GetInstance()) 
LOCAL  cDrive:= ALLTRIM(UPPER(CurDrive()))+":"
LOCAL   cPath:= ALLTRIM(UPPER(WNetGetConnection(cDrive)))  //aki devuelve vacio en caso de ser disco local, o el nombre en caso de una unidad de red.
LOCAL    cRed:= ALLTRIM(UPPER(SUBSTR(cPath,1,2)))
LOCAL  cNomR1:= ALLTRIM(UPPER(SUBSTR(cPath,3)))
LOCAL  cNmRed:= SUBSTR(cNomR1,1,AT("\",cNomR1))

msginfo(cRuta)
msginfo(cDrive)
msginfo(cPath)
msginfo(VALTYPE(cPath),LEN(cPath))
msginfo(cRed)
msginfo(cNomR1)
msginfo(cNmRed)

Return nil
Es extraño, y creo que a la vez ilógico, puesto que cuando la unidad a examinar es local o en red, cPath siempre devuelve el mismo valor.

He revizado la fuente en el archivo NET.C, y ahi declara un bufer de 249, pero no entiendo porque devuelve siempre el mismo valor.

Habra una forma de solucionar este problema, o alguna funcion que sustituya a WNetGetConnection()

Saludos y en espera de comentarios... :wink:

Posted: Tue Dec 02, 2008 1:29 am
by Rochinha
Esto te serve:

Code: Select all

/*
 * ***** PC-Toledo snip by Toledo ******
 */
#include "FiveWin.ch"

function Main()
   LOCAL cDrive, i, cServer
   FOR i:=1 TO 26
      cDrive := Chr(64+i) + ":"
      cServer := NetRmtName( cDrive )
      IF !Empty( cServer )
         ? cDrive, cServer
      ENDIF
   NEXT
RETURN
Agrega CT.LIB de http://www.5volution.com/forum/ct.lib.zip (renomear a CT.LIB)

Minha ideia:

Code: Select all

Function GetDrvMapLetter( cPathName )
   LOCAL cDrive, i, cServer
   FOR i = 1 to 26
       cDrive  := chr(64+i) + ":"
       cServer := NetRmtName( cDrive )
       IF alltrim( cPathName ) == alltrim( cServer )
          return cDrive
       ENDIF
   NEXT
   return ""
Uso:
GetDrvMapLetter( "\\MyServer\MyPC\C" )

Posted: Tue Dec 02, 2008 3:57 pm
by cuatecatl82
Rochinha Gracias por contestar

En un momento hago pruebas con la segunda opcion que me das, te comento que en la primera, no puedo hacer las pruebas porque el enlace a la libreria que indicas ya no funciona.

Sería posible que me enviaras la libreria a mi correo.. danyleon82@hotmail.com :oops: :oops:

Te lo agradecería mucho. :lol:

Saludos..



Maestro Antonio:

Alguna idea de que puedo hacer para poder solucionar el problema..?

Muy Agradecido...

Posted: Tue Dec 02, 2008 4:36 pm
by derpipu
Probado y funciona solo hay que ponerle un exit para que se rompa el bucle de no ser asi nos regresa en blanco..

Saludos


P.D. Ah y la libreria CT.LIB esta en xharbour/lib no se si este en harbour...

Posted: Tue Dec 02, 2008 4:47 pm
by derpipu
Hola a todos, una correccion si no le pongo el lower en la comparacion no me da la unidad correctamente..

Code: Select all

function GetDrvMapLetter( cPathName )
   LOCAL cDrive, i, cServer

   FOR i = 1 to 26
       cDrive  := chr(64 + i) + ":"
       cServer := NetRmtName( cDrive )
       IF alltrim( lower(cPathName) ) == alltrim( lower(cServer) )
          return cDrive
          exit
       ENDIF
   NEXT
   return ""

Posted: Tue Dec 02, 2008 4:56 pm
by derpipu
Bueno y ya entrando a detalle, de que eran unas funciones que hace un buen tiempo necesitaba, ahora las modifique un poco, y aqui les dejo _

Code: Select all

function cDrvMapToLetter( cPathName )
   LOCAL cDrive, i, cServer

   FOR i = 1 to 26
       cDrive  := chr(64 + i) + ":"
       cServer := NetRmtName( cDrive )
       IF alltrim( lower(cPathName) ) == alltrim( lower(cServer) )
          return cDrive
          exit
       ENDIF
   NEXT
   return ""

function cLetterToDrvMap( cLetter )
return( NetRmtName( upper(cLetter) ) )

A ver si como dice RF no estoy matando pulgas a cañonzos..

Felices Fiestas

Posted: Tue Dec 02, 2008 10:13 pm
by cuatecatl82
Gracias a ambos por contestar:

Quedo solucionado el problema..

Un Saludo.

Posted: Wed Dec 03, 2008 7:33 am
by Rochinha
Ahora el enlace funciona perfecto.

Derpitu, revisa esto:
derpipu wrote: ...

Code: Select all

function GetDrvMapLetter( cPathName )
   LOCAL cDrive, i, cServer

   FOR i = 1 to 26
       cDrive  := chr(64 + i) + ":"
       cServer := NetRmtName( cDrive )
       IF alltrim( lower(cPathName) ) == alltrim( lower(cServer) )
          return cDrive 
          exit // ***** esto no funciona, RETURN termina el processo *****
       ENDIF
   NEXT
   return ""
...