Título: Error CopyMemory y estructura SafeArray (Via API) Publicado por: BlackZeroX 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
a Código
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
Dulces Infierno Lunar!¡. Título: Re: Error CopyMemory y estructura SafeArray (Via API) Publicado por: BlackZeroX 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
Nota: Solo Array's, aun queen este caso... Dulces Lunas!¡. Título: Re: Error CopyMemory y estructura SafeArray (Via API) Publicado por: Tokes 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. Título: Re: Error CopyMemory y estructura SafeArray (Via API) Publicado por: BlackZeroX 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 (http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.ole.interop.safearray.ffeatures.aspx) 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 (http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.ole.interop.safearray.ffeatures.aspx))!¡. aqui hay un link a la MSDN http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.ole.interop.safearray.aspx Edito:--------------------------> Código
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!¡. Título: Re: Error CopyMemory y estructura SafeArray (Via API) Publicado por: LeandroA en 24 Agosto 2010, 04:03 am hola BlackZerox lo que pusiteen este link (http://www.leandroascierto.com.ar/foro/index.php?topic=450.msg2271#msg2271) me funciona bien no entiendo cual es el problema.
Saludos. Título: Re: Error CopyMemory y estructura SafeArray (Via API) Publicado por: BlackZeroX 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!¡. Título: Re: Error CopyMemory y estructura SafeArray (Via API) Publicado por: Karcrack 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 Título: Re: Error CopyMemory y estructura SafeArray (Via API) Publicado por: Psyke1 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? Jajajajajajaj :laugh: :laugh:MOD: Código: http://www.vbforums.com/showthread.php?t=625615 Pregunte en vbforums para ver si podian resolverlo, que a mi tambien me interesa... ;) DoEvents¡! :P Título: Re: Error CopyMemory y estructura SafeArray (Via API) Publicado por: Psyke1 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 Título: Re: Error CopyMemory y estructura SafeArray (Via API) Publicado por: BlackZeroX 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!¡. |