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

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP)
| | | |-+  Programación Visual Basic (Moderadores: LeandroA, seba123neo)
| | | | |-+  Error CopyMemory y estructura SafeArray (Via API)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Error CopyMemory y estructura SafeArray (Via API)  (Leído 4,363 veces)
BlackZeroX
Wiki

Desconectado Desconectado

Mensajes: 3.158


I'Love...!¡.


Ver Perfil WWW
Error CopyMemory y estructura SafeArray (Via API)
« en: 24 Agosto 2010, 02:27 am »


Edito:

Antes que nada No es factible hacer un Simple Copymemory por que Crashea!¡ de forma instantanea asi que para esto hay que manipular y bloquear el Array con la estructura SafeArray.

Pero aun no encuentro la Solución
[/i][/b]

intento copiar el contenido de una variable tipo variant a una avriable de matrix variant

Código
  1.  
  2. Dim VarVariant as variant
  3.  
  4.  

a

Código
  1.  
  2. Dim VarVariantDest() as variant
  3.  
  4.  

La cosa es sencilla, copia bien la primera vez posteiormente me crashea... y creo que es por la Estructura SafeArray, ( ya intente varias cosas incluida sin Apis y con solo manejo de la dicha Estructura y sigue de la misma manera!¡. )

Aqui el codigo

Código
  1.  
  2. Option Explicit
  3. Option Base 0
  4.  
  5. Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
  6.        (Destination As Any, Source As Any, ByVal Length As Long)
  7. Private Declare Function SafeArrayAccessData Lib "Oleaut32" _
  8.        (ByVal psa As Long, pvData As Long) As Long
  9. Private Declare Function SafeArrayUnaccessData Lib "Oleaut32" _
  10.        (ByVal psa As Long) As Long
  11. '   //  msvbvm60.DLL
  12. Private Declare Function VarPtrArray Lib "msvbvm60.dll" Alias "VarPtr" _
  13.    (Var() As Any) As Long
  14.  
  15. Private Sub Test_Translate()
  16.    Dim VarVariant          As Variant
  17.    Dim VarVariantDest()    As Variant
  18.    Dim aaa(0 To 3)         As Variant
  19.    Dim psa                 As Long
  20.    Dim pData               As Long
  21.  
  22.    aaa(0) = "Miguel"
  23.    aaa(1) = "Angel"
  24.    aaa(2) = "Ortega"
  25.    aaa(3) = "Avila"
  26.  
  27.    VarVariant = aaa
  28.  
  29.    ReDim Preserve VarVariantDest(0 To 7)
  30.    CopyMemory psa, ByVal VarPtr(VarVariant)+8, 4
  31.  
  32.    If SafeArrayAccessData(psa, pData) = 0 Then   ' Bloqueo el Array y obtengo el puntero de varptr(VarVariant(0))
  33.        CopyMemory VarVariantDest(4), ByVal pData, 4 * 16  ' Copio el Contenido
  34.        SafeArrayUnaccessData psa  ' Desbloqueo el array
  35.    End If
  36.  
  37.    For psa = LBound(VarVariantDest) To UBound(VarVariantDest)
  38.        Debug.Print psa, VarVariantDest(psa)
  39.    Next psa
  40. End Sub
  41.  
  42. Private Sub Form_Load()
  43. Dim i       As Byte
  44.    For i = 1 To 10
  45.        Call Test_Translate
  46.        MsgBox "Prueba: " & i
  47.    Next i
  48. End Sub
  49.  
  50.  

Dulces Infierno Lunar!¡.


« Última modificación: 24 Agosto 2010, 03:18 am por BlackZeroX » En línea

The Dark Shadow is my passion.
BlackZeroX
Wiki

Desconectado Desconectado

Mensajes: 3.158


I'Love...!¡.


Ver Perfil WWW
Re: Error CopyMemory y estructura SafeArray (Via API)
« Respuesta #1 en: 24 Agosto 2010, 02:54 am »

solo como dato para no matarse , la estructura SafeArray es de 16 Bytes aqui se las dejo por si alguien la requiere con esta cuestion!¡.

Código
  1.  
  2. Private Type SafeArrayReader
  3.    cDims As Integer            ' nr of dimensions for the array
  4.    fFeatures As Integer        ' extra information about the array contents
  5.    cbElements As Long          ' nr of bytes per array element. Possible Examples: 1=byte,2=integer,4=long,8=currency
  6.    cLocks As Long              ' nr of times array was locked w/o being unlocked
  7.    pvData As Long              ' address to 1st array item, can be a pointer to another structure/address
  8. End Type
  9.  
  10.  

Nota: Solo Array's, aun queen este caso...

Dulces Lunas!¡.


« Última modificación: 24 Agosto 2010, 03:07 am por BlackZeroX » En línea

The Dark Shadow is my passion.
Tokes

Desconectado Desconectado

Mensajes: 140


Ver Perfil
Re: Error CopyMemory y estructura SafeArray (Via API)
« Respuesta #2 en: 24 Agosto 2010, 03:05 am »

Oye, BlackZeroX, no entiendo algo (por no decir todo):

¿La variable psa que papel juega ahí?

¿Si la usamos en copymemory que es lo que hace?

Si ejecuto tu código como está se cierra visual basic.

Si lo ejecuto así, ya no se cierra:

 
Código:
If SafeArrayAccessData(VarPtr(VarVariant), pData) = 0 Then

aunque, claro, no tengo ni la menor idea de que es lo que hace.

               Saludos.
En línea

BlackZeroX
Wiki

Desconectado Desconectado

Mensajes: 3.158


I'Love...!¡.


Ver Perfil WWW
Re: Error CopyMemory y estructura SafeArray (Via API)
« Respuesta #3 en: 24 Agosto 2010, 03:12 am »

PSA es el puntero a la estructura SafeArray

es decir hay algo que no saben muchos y es que una variable es una estructura... pero en este caso PSA son los 4 primeros bytes a esta (SAFEARRAY) la cual contiene informacion de la variable, si es una variable Variant sin matrix los 4 primeros bytes indican el tipo del mismo los siguientes estas vacios y los 4 siguientes indican el puntero al contenido (en este caso seria asi, si fuese un array la estructura que puse arribita es la usada para saber TODA la informacion de una variable tipo Array, Dimenciones, cuanto pesa una dimencion y por ende la lontitud en bytes del array, el incice inferior, el tipo Gral del Array)!¡.

aqui hay un link a la MSDN

http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.ole.interop.safearray.aspx

Edito:-------------------------->

Código
  1.  
  2. If SafeArrayAccessData(VarPtr(VarVariant), pData) = 0 Then
  3.  
  4.  

Esta mal debes pasarle el puntero del SafeArray mas no el de la Variable, SafeArrayAccessData = 0 cuando sale todo bien cualquier otro valor es un Error.

Dulces Lunas!¡.
« Última modificación: 24 Agosto 2010, 03:26 am por BlackZeroX » En línea

The Dark Shadow is my passion.
LeandroA
Moderador
***
Desconectado Desconectado

Mensajes: 760


www.leandroascierto.com


Ver Perfil WWW
Re: Error CopyMemory y estructura SafeArray (Via API)
« Respuesta #4 en: 24 Agosto 2010, 04:03 am »

hola BlackZerox lo que pusiteen este link me funciona bien no entiendo cual es el problema.

Saludos.
En línea

BlackZeroX
Wiki

Desconectado Desconectado

Mensajes: 3.158


I'Love...!¡.


Ver Perfil WWW
Re: Error CopyMemory y estructura SafeArray (Via API)
« Respuesta #5 en: 24 Agosto 2010, 05:33 am »

Ok bien el problema es el siguiente

en aquel es de esta forma

VarVariantOri() -> VarVariantDest()

el problema aqui y ahora es

VarVariantOri() -> VarVariantAux - VarVariantDest()

Los codigos aunque se parecen, realmente SON DISTINTOS!¡.

Si pruebas el codigo de arriba veras que te va a Crashear, el otro no te crasheara por que ya esta bien!¡.

Dulces Lunas!¡.
« Última modificación: 24 Agosto 2010, 05:43 am por BlackZeroX » En línea

The Dark Shadow is my passion.
Karcrack


Desconectado Desconectado

Mensajes: 2.416


Se siente observado ¬¬'


Ver Perfil
Re: Error CopyMemory y estructura SafeArray (Via API)
« Respuesta #6 en: 24 Agosto 2010, 11:20 am »

Antes de ponerme a codear nada... Tu lo que quieres hacer es establecer un nuevo Array tipo Variant en el que el primer valor sea aaa?

MOD:
Código:
http://www.vbforums.com/showthread.php?t=625615
:o :o :o Psyke tiene un primo Ingles!!! :laugh:
« Última modificación: 24 Agosto 2010, 11:35 am por Karcrack » En línea

Psyke1
Wiki

Desconectado Desconectado

Mensajes: 1.089



Ver Perfil WWW
Re: Error CopyMemory y estructura SafeArray (Via API)
« Respuesta #7 en: 24 Agosto 2010, 11:51 am »

Antes de ponerme a codear nada... Tu lo que quieres hacer es establecer un nuevo Array tipo Variant en el que el primer valor sea aaa?

MOD:
Código:
http://www.vbforums.com/showthread.php?t=625615
:o :o :o Psyke tiene un primo Ingles!!! :laugh:
Jajajajajajaj  :laugh: :laugh:
Pregunte en vbforums para ver si podian resolverlo, que a mi tambien me interesa... ;)

DoEvents¡! :P
En línea

Psyke1
Wiki

Desconectado Desconectado

Mensajes: 1.089



Ver Perfil WWW
Re: Error CopyMemory y estructura SafeArray (Via API)
« Respuesta #8 en: 24 Agosto 2010, 16:15 pm »

Esta es la respuesta que me han dado traducida con Google ( no os riais :P ):
Citar
Crashea porque los artículos VarVariantDest de 4, 5, 6 y 7 contienen los punteros a los datos exactamente la misma cadena que está contenido por la AAA.

Al final del procedimiento Test_Translate, cuando se limpia las cosas, dicen que primero destruye aaa y todas las cadenas contenidas en él. A continuación se limpia VarVariantDest - pero contiene punteros a las cadenas que ya han sido destruidos. Resultado final: usted obtiene un accidente.

En este caso es mucho mejor usar la antigua forma para copiar el contenido de la matriz, especialmente si usted no está tratando de lograr la eliminación de los elementos de la matriz original y simplemente colocando el directamente en la matriz de otros.

Citar
¿No sabe cómo está familiarizado con el almacenamiento de cadenas / referencias. Una cadena almacenada dentro de nada: matriz variante, o, simplemente, una variable de cadena en realidad no contienen los datos de cadena. Los datos de cadena se almacena en otra parte de la memoria.

variable de cadena: la variable contiene una cadena de bytes puntero del 4 al carácter primero de los datos de la cadena
matriz de cadenas dinámica: la matriz se compone de 4 entradas de bytes. Cada entrada de la matriz es un puntero de cadena
variante: los datos dentro de la variante es un puntero de cadena

Cada vez que un puntero de cadena se copia con CopyMemory, va a copiar el puntero, no la cadena. Cuando una cadena se copia con VB (es decir, newString oldString =), una nueva cadena se crea y cada variable tiene un puntero distinto. Si un puntero se duplica con cada vez CopyMemory, una copia de ese puntero debe ser llevado a cero otra cosa que obtener accidentes. Como Merri explicó esto se debe a VB limpia las cuerdas y que está tratando de limpiar la misma cadena dos veces. La primera vez que está bien, la memoria por segunda vez ya no se asigna y se bloquea la aplicación.
Mira esto: http://www.codeguru.com/vb/gen/vb_misc/algorithms/article.php/c7495

Fuente:
Código:
http://www.vbforums.com/showthread.php?p=3870342#post3870342

DoEvents¡!
:P
« Última modificación: 24 Agosto 2010, 19:06 pm por *PsYkE1* » En línea

BlackZeroX
Wiki

Desconectado Desconectado

Mensajes: 3.158


I'Love...!¡.


Ver Perfil WWW
Re: Error CopyMemory y estructura SafeArray (Via API)
« Respuesta #9 en: 24 Agosto 2010, 18:58 pm »

.
mmm como dato es cuando se consultan los valores de VarVariantDest despues de haber hecho el CopyMemory (en el For Next), bueno mejor dicho el Crash no se presenta al final del proceso se Produce en la Consulta

La solucion que estoy viendo es obtener el puntero a la matriz aaa() por medio de VarVariant, haber si lo calculo, ya les cuento!¡.


Dulces Lunas!¡.
« Última modificación: 24 Agosto 2010, 19:00 pm por BlackZeroX » En línea

The Dark Shadow is my passion.
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[Ayuda] Sobre copyMemory
Programación Visual Basic
ignorantev1.1 0 1,826 Último mensaje 24 Febrero 2011, 22:37 pm
por ignorantev1.1
error estructura al compilar
Programación C/C++
indict 4 2,452 Último mensaje 2 Julio 2013, 18:39 pm
por indict
Error:Estructura con strings
Programación C/C++
SkaTrumpet 2 2,196 Último mensaje 12 Mayo 2016, 14:52 pm
por AlbertoBSD
Error que no encuentro (C - Estructura, vectores)
Programación C/C++
Geg1 7 2,486 Último mensaje 16 Noviembre 2016, 01:23 am
por engel lex
Error en la estructura in_addr
Programación C/C++
mester 1 1,563 Último mensaje 23 Marzo 2017, 17:22 pm
por xv0
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines