elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Sigue las noticias más importantes de seguridad informática en el ttwitter! de elhacker.NET


  Mostrar Mensajes
Páginas: [1] 2 3
1  Programación / Programación Visual Basic / Re: ciclo de vida de un objeto en: 17 Enero 2008, 03:35 am
Los objetos viven desde que se crean hasta que se establecen a Nothing, o hasta que el programa finalice normalmente. En el caso de referencias circulares, teóricamente nunca se destruyen (a menos que el programa finalice).

Vamos a suponer que tenemos dos módulos de clase:

Código:
'
' CClasePadre
'
Private oChild As CClaseHijo

Function foo(sArg As String) As Boolean
  Debug.Print sArg

  foo = True
End Function

Property Get Child() As CClaseHijo
  Set Child = oChild
End Property

Private Sub Class_Initialize()
  '
  ' Constructor de la clase.
  ' Crea una instancia de la clase Hijo y
  ' se asigna a sí misma como Padre.
  '
  Set oChild = new CClaseHijo

  oChild.setParent(Me)
End Sub

Código:
'
' CClaseHijo
'
Private oParent As CClasePadre

Friend Sub setParent(oArg As Object) As Boolean
  Set oParent = oArg
End Function

Property Get Parent() As CClasePadre
  Set Parent = oParent
End Property

Ahora, vamos a hacer algunas pruebas:

Código:
Sub TestClass()
  Dim Padre As CClasePadre
  Dim Hijo   As CClaseHijo

  ' Crea el objeto Padre y la función constructora del
  ' mismo crea una instancia de Hijo (Class_Initialize)
  '
  Set Padre = New CClasePadre

  '
  ' Obtiene una referencia del hijo del objeto
  ' padre y la guarda en la variable local Hijo
  '
  Set Hijo = Padre.Child

  '
  ' En teoría debería destruir al objeto Padre, pero
  ' como Hijo tiene la propiedad Parent que hace referencia
  ' a nuestro objeto Padre, el objeto no se destruye, sólo
  ' esta instancia.
  '
  Set Padre = Nothing

  '
  ' Ahora en teoría, debería destruirse el objeto Hijo, pero como
  ' este tiene la propiedad Parent con el objeto Padre (que en teoría ya
  ' destruímos si no supiéramos que sigue activo en este lugar), y
  ' Parent (Padre) tiene la propiedad que hace referencia a Hijo,
  ' el objeto no se destruye, SÓLO la instancia guardada en Hijo
  '
  Set Hijo = Nothing
End Sub

Como verás, este es un claro ejemplo de referencias circulares. Lo que sucede cuando eliminamos TODAS nuestras instancias conocidas como hicimos con la variable Padre e Hijo, en memoria sigue existiendo al menos una instancia de cada una, e indestructibles porque cada una hace referencia a la otra.

Hay que tener mucho cuidado con esto a la hora de usar referencias circulares, y en todo caso si una clase se va a crear recursivamente evitar este tipo de prácticas porque podríamos ocupar grandes cantidades de memoria.

De todas formas, TODOS los objetos se destruyen -sí o sí- cuando el proceso se cierra, porque están guardados siempre en el espacio de direcciones de memoria de este proceso.

Saludos.
2  Programación / Programación Visual Basic / Re: index * objects en: 17 Enero 2008, 03:12 am
Crea una matriz de controles. Para eso cuando crees los controles en el formulario, debes asignarle a cada control el mismo nombre, entonces automáticamente VB crea un array de objetos, y se le asignará un índice a cada uno (propiedad Index). Luego, es simplemente recorrer los controles como un array común:

Código
  1. Private Sub Form_MouseMove(Index As Integer, Button As Integer, Shift As Integer, X As Single, Y As Single)
  2.  For i = 1 to 40
  3.    image(i).visible = false
  4.  Next
  5. End Sub
  6.  

image sería el nombre de todos los controles.

Bytez.
3  Programación / Programación Visual Basic / Re: detectar otras unidades(?) en: 15 Enero 2008, 15:37 pm
Versión minimizada:

Código
  1. Option Explicit
  2.  
  3. Private Declare Function GetLogicalDriveStrings Lib "kernel32" Alias "GetLogicalDriveStringsA" (ByVal nBufferLength As Long, ByVal lpBuffer As String) As Long
  4. Private Declare Function GetDriveType Lib "kernel32" Alias "GetDriveTypeA" (ByVal nDrive As String) As Long
  5.  
  6. Function fGetDrives() As String
  7.    Dim lStrLen&
  8.    Dim sDrives As String * 255
  9.  
  10.    lStrLen = GetLogicalDriveStrings(255, sDrives)
  11.    fGetDrives = Left$(sDrives, lStrLen)
  12. End Function
  13.  
  14. Function fDriveType(strDriveName As String) As String
  15.    Dim lDrvType&
  16.    Dim strDrive()
  17.  
  18.    lDrvType = GetDriveType(strDriveName)
  19.    strDrive = Array( _
  20.        "Unknown Drive Type", "Drive does not exist", "Removable Media", _
  21.        "Fixed Drive", "Network Drive", "CD Rom", "Ram Disk" _
  22.    )
  23.    fDriveType = strDrive(lDrvType)
  24. End Function
  25.  
  26.  
  27. Sub sListAllDrives()
  28.    Dim sAllDrives$, sDrive$()
  29.    Dim strTmp As String
  30.  
  31.    sAllDrives = fGetDrives()
  32.    sDrive = Split(sAllDrives, vbNullChar)
  33.  
  34.    For i = 0 To UBound(sDrive)
  35.        If (sDrive(i) <> vbNullString) Then
  36.            Debug.Print Spc(2); fDriveType(sDrive(i)) & ": " & sDrive(i)
  37.        End If
  38.    Next
  39. End Sub
  40.  
  41. Private Sub Form_Load()
  42.    Debug.Print "All available drives: "
  43.  
  44.    Call sListAllDrives
  45. End Sub
  46.  
4  Programación / PHP / Re: Ayuda proteger mis .js internos con PHP en: 10 Enero 2008, 22:09 pm
Podrías verificar el http referer con $_SERVER['HTTP_REFERER']. Si no proviene de tu dominio, no muestras el js.

Saludos.
5  Programación / Programación Visual Basic / Re: ¿Se pueden utilizar interfaces en Visual Basic 6.0? en: 6 Enero 2008, 03:54 am
No existe una forma de crear -explícitamente- una interfaz, pero se puede hacer creando un módulo de clase con los prototipos de las funciones y eventos estableciendolo como PublicNotCreatable, y luego implementarlo utilizando la palabra clave Implements:

Código
  1. '
  2. ' Modulo de clase: MyInterface.cls
  3. '
  4.  
  5. Option Explicit
  6.  
  7. Sub Foo()
  8.  
  9. End Sub
  10.  
  11. Function Something(ByVal Arg As String)
  12.  
  13. End Function
  14.  

Código
  1. '
  2. ' Modulo de clase: MyClass.cls
  3. '
  4. Option Explicit
  5.  
  6. Implements MyInterface
  7.  
  8. Property Get ClassName()
  9.    ClassName = "Test Class"
  10. End Property
  11.  
  12. Private Sub MyInterface_Foo()
  13.    Debug.Print "Foo called from MyClass"
  14. End Sub
  15.  
  16. Private Function MyInterface_Something(ByVal Arg As String) As Variant
  17.    Debug.Print "Something from MyClass like: " & Arg
  18. End Function
  19.  

Código
  1. '
  2. ' Módulo estándar Test.bas
  3. '
  4. Option Explicit
  5.  
  6. Sub Test()
  7.    Dim csInterface As MyInterface
  8.    Dim csClass     As New MyClass
  9.  
  10.    Debug.Print csClass.ClassName
  11.  
  12.    Set csInterface = csClass
  13.  
  14.    Call csInterface.Something("Hola Mundo")
  15. End Sub
  16.  

Fijate que cuando se ejecute Test, lo que va a estar llamando es a la función implementada en MyClass, por lo que el output sería algo así:

Código:
Test Class
Something from MyClass like: Hola Mundo

Bytez.
6  Programación / Programación Visual Basic / Re: Y si fuera un número entre 0 y 14 en: 6 Enero 2008, 03:37 am
Es más apropiado Select Case.

Código
  1. Select Case (Numero)
  2.  Case 0 To 14: ' Do Something
  3.  Case 15 To 29: ' Do Something
  4.  Case Else: ' Otro número fuera de los dos rangos.
  5. End Select
  6.  
7  Programación / Programación Visual Basic / Re: ¿Como optimizar la apertura de archivos en Binario? en: 4 Enero 2008, 05:31 am
Usando matriz de byte el código queda absolutamente optimizado. Los Strings son lentos y no son apropiados para operaciones que requieren mucho procesamiento.

El siguiente código lee los datos del archivo a una matriz de Byte, luego cifra los datos modificando el valor de cada byte con un algoritmo sencillo y lineal, y por último convierte a String los datos cifrados.

Para descifrar, hay que convertir los datos a matriz de Byte. Ejemplo:

Código
  1. Dim btData() As Byte
  2. Dim sString$, sDecrypt$
  3.  
  4. sString = "BRdTYTQ@QRG^"
  5.  
  6. btData = StrConv(sString, vbFromUnicode)
  7.  
  8. sDecrypt = Decrypt(btData)
  9.  
  10. Debug.Print sDecrypt
  11.  

Código
  1. Sub EncryptFile(Source As String)
  2.  Dim btData() As Byte
  3.  Dim sEnc$
  4.  
  5.  Open Source For Binary As #1
  6.  
  7.  ReDim btData(LOF(1)) As Byte
  8.  
  9.  Get #1,  1, btData
  10.  
  11.  sEnc = Encrypt(btData)
  12.  
  13.  Close #1
  14. End Sub
  15.  
  16. Function Encrypt(pData) As String
  17.  Encrypt = Crypto(pData, True)
  18. End Function
  19.  
  20. Function Decrypt(pData) As String
  21.  Decrypt = Crypto(pData, False)
  22. End Function
  23.  
  24. Function Crypto(pData, Optional bEncrypt As Boolean = True) As String
  25.  Dim iFlag%
  26.  Dim i&, lLen&
  27.  
  28.  lLen = UBound(pData)
  29.  
  30.  If (bEncrypt) Then iFlag = -1 Else iFlag = 1
  31.  
  32.  For i = 0 To lLen
  33.    pData(i) = pData(i) + ((i + (i Mod lLen) + 17) * iFlag)
  34.  Next
  35.  
  36.  Crypto = StrConv(pData, vbUnicode)
  37. End Function
  38.  
  39.  

Saludos.
8  Programación / Programación Visual Basic / Re: ¿Como optimizar la apertura de archivos en Binario? en: 3 Enero 2008, 15:48 pm
Código:
Dim btData() As Byte
Dim sData$

Open archivo For Binary As #1

ReDim btData(LOF(1)) As Byte

Get #1,  1, btData

sData = StrConv(btData, vbUnicode)

Close #1
9  Programación / Programación Visual Basic / Re: Leer parte de un archivo (Offset) en: 31 Diciembre 2007, 15:32 pm
Código:
Open "C:\server.exe" for binary as #1
Server = Input(LOF(1),1)
Close #1
Resultado = Mid(Server,40,3)

donde puse 40,3 no va 40... tire un numero... pero iria la ubicacino del 1 del 127... 3 es xq 127 tiene 3 caracteres...

bueno la verdad no se si te sirve... xD

pero suerte y SALUDOS

El acceso binario no es para eso... la idea es poder leer DATOS BINARIOS.

Código:
Dim lOffset    As Long
Dim valorByte  As Byte
Dim valorLng   As Long
Dim sStaticStr As String * 6
Dim btData(5)  As Byte


lOffset = 17  ' Offset donde se quiere leer, relativo al principio del archivo.

Open "C:\server.exe" for Binary as #1

Get #1, lOffset, valorByte  ' Lee 1 byte en esa posición.
Get #1, lOffset, valorLong  ' Lee 4 bytes en esa posición.
Get #1, lOffset, sStaticStr ' Lee 6 bytes y los mete en un String.
Get #1, lOffset, btData     ' Lee 6 bytes en un array de bytes.

Debug.Print StrConv(btData, vbUnicode)  ' Convierte el array de bytes en String.

Close #1

Bytez.
10  Foros Generales / Foro Libre / Re: Sus escritorios en: 9 Diciembre 2007, 19:01 pm

Aunque no lo crean, es un escritorio de Windows, con BlackBox y estilo customizado. Le llamo, como dice el wallpaper: "Digital Chaos".

Saludos.
Páginas: [1] 2 3
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines