jueves, 26 de abril de 2012

Cómo registrar librerias DLL de 32Bits en sistemas de 64Bits

Antes de nada os pongo un poco de información:
extraida de:
http://geeks.ms/blogs/lmartinez/archive/2007/06/21/ejecutando-aplicaciones-de-32-bits-en-puestos-con-s-o-windows-de-64-bits.aspx

Ejecutando aplicaciones de 32 bits en puestos con S.O. Windows de 64 bits

Estaba yo en uno de esos trabajos inspirados en "Los 12 trabajos de Hércules" que me tocan realizar antes de coger vacaciones, cuando me encontré intentando ejecutar en Vista 64bits aplicaciones de 32 bits creadas en Visual Basic 6, y me encontré con algunos problemas para hacerlos funcionar.
Al final conseguí que funcionaran y mientras miraba en Internet intentando buscar solución a los diversos problemas, me encontré con algunos artículos que me enseñaron algunos conceptos que no sabía sobre la manera en que un sistema Windows de 64 bits conseguía que funcionaran en él aplicaciones de 32 bits.
Supongo que la mayor parte de los lectores ya conocerán el funcionamiento de la emulación, pero no me resisto aquí a traducir unos artículos que explican muy bien cómo funciona:
"Las versiones x64 de Windows (entre ellas la reciente de Windows Vista 64 bits) no son capaces de ejecutar código de 32 bits de forma nativa. Como hoy en día la mayor parte de las aplicaciones siguen siendo de 32 bits, las versiones x64 de Windows hacen uso de un emulador conocido como WOW64 para permitir que las aplicaciones de 32 bits funcionen en ellas.
Uno de los problemas con el funcionamiento de código de 32 bits en un sistema operativo de 64 bits es que el OS debe mantener una separación completa del código. Microsoft ha creado una carpeta nueva llamada \Windows\SysWOW64 que se utiliza para almacenar las DLL y componentes de 32bits. En las versiones de 32 bits de Windows, los archivos DLL se almacenan normalmente en la carpeta \Windows\System32. Sin embargo, en las versiones de 64 bits de Windows se utiliza la carpeta \Windows\System32 para las DLL de 64bits.
Como se puede ver, el emulador WOW64 debe realizar el cambio de dirección del sistema de ficheros para garantizar que el código de 32 y 64 bits siga separado. Pero mantener archivos del DLL separados es solamente el principio. El emulador WOW64 realiza el cambio de dirección del sistema de ficheros para varios componentes clave del sistema operativo deWindows.
Otro lugar en Windows en donde se utiliza el cambio de dirección del sistema de ficheros es en la carpeta de archivos de programa. Casi todas las aplicaciones instaladas copian sus archivos a la carpeta “C:\Program Files” dentro de una carpeta propia para la aplicación. En las versiones x64 de Windows, las aplicaciones de 64 bits están instaladas en la carpeta“C:\Program Files” y las aplicaciones de 32 bits están instaladas en una carpeta nombrada“C:\Program Files (x86)”.
Sin embargo, la carpeta de archivos de programa puede no estar siempre en el mismo lugar en cada microordenador. Por ello, la mayoría de los desarrolladores no hacen referencia dentro sus programas directamente a “C:\Program Files” sino que llaman a funciones para obtener el nombre real de esta carpeta en el PC en cuestión.
En las versiones de 32 bits de Windows, la función SHGetSpecialFolder() se utiliza para determinar el nombre y la localización de la carpeta de archivos de programa. Pero en la versión de un S.O. x64, la función mira si la aplicación funciona a 32 bits o a 64 y realiza el cambio de dirección de la carpeta apuntando a la adecuada.
La instalación de una aplicación no es la única vez que se hace referencia a la carpeta de archivos de programa; puede también ser referenciada en el tiempo de ejecución. Aunque hay varias maneras que una aplicación pueda determinar el nombre y la localización de la carpeta de archivos de programa, el empleo de las variables de entorno es lo más utilizado. En una versión de 32 bits de Windows, la variable de entorno %ProgramFiles% contiene la trayectoria a la carpeta de archivos de programa. En una versión x64 de Windows, esta variable de entorno también se utiliza, pero trabaja de una forma diferente.
La regla más importante de la plataforma x64 es que no puedes mezclar de ninguna manera código de 64 y 32 bits. Las variables de entorno se llaman a menudo dentro de ficheros de comandos por lotes (.CMD o .BAT) o por scripts. Siendo éste el caso, ejecutar scripts puede ser un poco peligroso en un entorno de 64 bits. ¿Debe Windows tratar el script como código de 32 bits o como de 64? La respuesta afecta no sólo al contenido de las variables de entorno, sino también que los programas que llame el propio script. Por ejemplo, un scriptde 64 bits no puede lanzar un proceso de 32 bits (por lo menos no de la manera normal).
Windows consigue solucionar estos problemas ofreciendo dos intérpretes de comandos: uno de 64 bits y otro de 32. Las variables de entorno se establecen de acuerdo al intérprete de comandos utilizado.
Por ejemplo, si se abre una ventana de comandos lanzando el comando CMD.EXE en la ventana “Inicio/Ejecutar …” (Run), Windows abrirá una ventana de comandos de 64 bits. En la mayoría de los casos, la variable de entorno %ProgramFiles% para el entorno de trabajo será fijada a “C:\Program Files”. Si se lanza un script, éste podrá ejecutar aplicaciones y comandos de 64 bits, pero no de 32 bits.
En el lado contrario, si se lanza “C:\Windows\SysWOW64\cmd.exe” en la ventana“Inicio/Ejecutar …”, la ventana de comandos que se ejecuta es de 32 bits. En ese caso, la variable de entorno del %ProgramFiles% será “C:\Program Files (x86)”.
Como se puede ver, la localización de la carpeta de archivos de programa se redirige dependiendo de si se está funcionando a 32 ó 64 bits. Pero hay una excepción a esta regla: si una aplicación tiene la referencia a la carpeta de archivos de programa escrita directamente como “C:\Program Files”, por ejemplo, se utilizará esta carpeta directamente, sin tener en cuenta el entorno en el que se está trabajando y esto podría dar lugar a diversos problemas, al intentar ejecutar código de 64 bits de algún componente cuando la aplicación es de 32 bits. Afortunadamente esto no es una buena práctica de programación y esperamos no encontrarlo en nuestras aplicaciones.
También en el registro hay una estructura a utilizar cuando se está trabajando a 64 bits y otra a usar cuando se está en 32 bits. Así, dentro de HKEY_LOCAL_MACHINE/SOFTWARE hay una arborescencia llamada Wow6432Node, que será utilizada en lugar deHKEY_LOCAL_MACHINE/SOFTWARE cuando se esté trabajando a 32 bits. Aquí tenemos el mismo funcionamiento y problemas que con las anteriores redirecciones.
Por ejemplo, si lanzamos un cambio del registro haciendo doble-click sobre un fichero .REG, las entradas a añadir o modificar se harán sobre las claves exactas que haya en este fichero y no como relativas a Wow6432Node si estos cambios son para una aplicación de 32 bits.
Si este fichero .REG es ejecutado por una aplicación o una ventana de comandos de 32 bits, los cambios se incluirán en la parte del registro correspondiente a 32 bits.
En resumen, con este sistema empleado por el emulador WOW64, se puede conseguir que la mayor parte de las aplicaciones de 32 bits puedan convivir con las de 64 en un puesto de trabajo que utilice un S.O. de 64 bits. Sin embargo, cuando estas aplicaciones, por alguna mala práctica de programación o por algún truco obligado hacen referencia o utilizan de una forma no estándar las carpetas \Windows\SYSTEM32 (o \Windows\SYSWOW64), Program Files (o Program Files (x86)) o el registro, puede haber problemas que impidan su correcta ejecución.
El registro de Windows es un archivo que contiene a mayoría de los datos de la configuración del sistema operativo de Windows. El registro contiene una variedad enorme de información, pero los datos de la configuración en que el emulador WOW64 está más interesado son una lista de todos los objetos del Component Object Model (COM) que han sido registrados por el sistema operativo.
COM proporciona una manera para que las aplicaciones (archivos .EXE) y las bibliotecas (archivos .DLL) puedan hacerse accesibles a cualquier otra aplicación o fichero de comandos que cumpla las normas COMCOM permite que alguien con habilidades de programación mínimas pueda escribir una aplicación o un script que interactúe con Windows. La persona que escribe la aplicación o el script puede hacerlo sin tener que aprender un lenguaje de programación tal como C++, y sin tener que aprender todos los interfaces de programación de Windows (APIs).
Windows se diseñó de manera que todos los objetos COM disponibles estuvieran dentro del registro. Para garantizar que el código de 32 bits esté aislado totalmente del código de 64 bits, los objetos COM de 32 y 64bits se almacenan en dos partes distintas del registro.
En lenguaje de Microsoft un servidor COM es un objeto que hace disponible su funcionalidad a través de COM. Las aplicaciones y scripts que hacen uso de esa funcionalidad se llaman clientes COM.
Cuando se habla de un servidor COM in-process se refiere generalmente a las bibliotecas (archivos .DLL), porque éstas se ejecutan como parte del mismo proceso que las aplicaciones y scripts que los llamaron. Un servidor COM out-of-process es un objeto COM(generalmente un fichero ejecutable) que se ejecuta en un proceso distinto que la aplicación o script que lo llamó.
Cuando una aplicación intenta registrar un objeto COM, el emulador WOW64 pondrá las entradas correspondientes en la sección apropiada del registro, dependiendo de si el objetoCOM es un objeto de 64 o de 32 bits.
Cuando una aplicación o un script que se supone que son de 32 bits intentan cargar un objeto COM en el proceso, el emulador WOW64 redirecciona el registro para estar seguro que la aplicación o script lee la porción del registro que refiere a objetos COM de 32 bits. Si el registro no contiene una referencia a una versión de 32 bits del objeto COM solicitado,WOW64 dirá a la aplicación que no existe el objeto, aunque exista una versión 64 bits disponible. La misma cosa sucede si una aplicación de 64 bits solicita un objeto COM.Windows comprobará la parte del registro correspondiente a 64 bits para saber si hay una referencia al objeto y no hará caso de cualquier objeto COM de 32 bits.

Servidores COM Out-of-process

La manera que WOW64 vuelve a dirigir peticiones de servidores COM in-process es bastante directa. Pero las cosas funcionan diferentemente para los servidores COM out-of-process. La redirección del registro todavía hace falta, pero esto es solamente una parte del proceso.
Las llamadas a un servidor COM out-of-process son la excepción a la regla de mantener separados el código de 32 bits y el de 64.
Aislar el código de 32 bits es normalmente un requisito porque no puedes mezclar código de 64 bits y de 32 dentro de un proceso. Pero cuando son servidores COM out-of-process, el objeto COM está funcionando en un proceso totalmente distinto del del código que lo llamó. Esto significa que la aplicación puede funcionar con código de 32 y llamar a un objeto COMde 64 bits, o viceversa.
Ya que la aplicación y el objeto COM están funcionando en procesos distintos, es fácil ver que sería posible que funcionaran ambos en el mismo sistema. ¿Pero cómo puede la aplicación comunicarse con un objeto COM si uno está funcionando en 32 bits y el otro en 64? Aunque la aplicación y el objeto COM no puedan interactuar directamente uno con otro porque estén funcionando en procesos distintos, pueden comunicarse con Remote Procedure Calls (RPCs).
Los ordenadores que funcionan en una versión x64 de Windows utilizan la redirección del registro para conseguir el funcionamiento de aplicaciones de 32 y 64 bits. Esta redirección del registro evita que las aplicaciones sobre-escriban la configuración de las de 64 bits, pero permite todavía que las aplicaciones y los archivos DLL que utilicen arborescencias escritas a mano continúen funcionando.
Las claves del registro relacionadas con las aplicaciones están instaladas generalmente en la clave HKEY_LOCAL_MACHINE\SOFTWARE. En una versión x64 de Windows, esta entrada se utiliza exclusivamente para almacenar los datos de la configuración relacionados con las aplicaciones de 64 bits. Los datos de configuración relacionados con aplicaciones de 32 bits se almacenan en la clave del registro HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432node.
Obviamente, las aplicaciones de 32 bits no están diseñadas para buscar en la entradaHKEY_LOCAL_MACHINE\SOFTWARE\WOW6432node. El emulador WOW64 intercepta las llamadas del registro de las aplicaciones de 32 bits y, de forma transparente, vuelve a dirigir estas llamadas al lugar apropiado dentro del registro de Windows.
La entrada HKEY_LOCAL_MACHINE\SOFTWARE a menudo contiene algo más que los datos de la configuración para las aplicaciones. En ella se almacenan los datos de configuración relacionados con cosas tales como la incrustación y vinculado de objetos o las llamadas remotas (RPCs). Por ello, las llamadas a las llaves secundarias debajo de esta entrada también se redirigen.

Reflexión del Registro

Así visto, la redirección del registro parece bastante potente. Incluso así, algunas funciones de Windows que se puede pensar que están garantizadas, por ejemplo la vinculación e incrustación de objetos y las asociaciones de ficheros por la extensión, no funcionarían correctamente si la redirección simple fuera el único mecanismo usado. Por ello, las versiones x64 de Windows utilizan también otra técnica conocida como reflexión del registro.
Esta técnica copias claves específicas y valores del registro entre las dos vistas del registro (una de 32 bits y otra de 64 bits) para mantenerlas sincronizadas. El reflector es inteligente y copia datos del COM activo para los servidores locales entre las vistas del registro, pero no los datos in-process, porque el mezclar datos in-process de 32 con 64 bits no se permite en un Windows de 64 bits."




Cómo registrar las DLL de 32bits en sistemas de 64bits
extraido de:

REGISTRAR UNA DLL EN SISTEMAS 64 BITS

Buenas, en este post os vamos a hablar como registrar una DLL 32 bits en windows 2K8R2, y en un sistema 64 bits(W7,VISTA...).
Es muy sencillo simplemente nos vamos a la ruta: C:\Windows\SysWOW64 y desde aquí ejecutamos el mismo comando que ejecutábamos anteriormente regsvr32.exe. Un ejemplo seria el siguiente:

C:\Windows\SysWOW64>regsvr32.exe "E:\Altiris\Altiris Agent\AeXAgentDiagnostics.dll"  y nos aparecia la siguiente ventana


Por lo que ya tendriamos nuestra DLL registrada.
Ademas aqui justo he registrado la DLL de diagnostico de Altiris, de la que hablaremos seguramente en otros post ;)
Decir que en la carpeta SysWOW64 tenemos las version 32 bits de los complementos de Windows.

miércoles, 25 de abril de 2012

Eliminar archivos creados con mas de 6 horas

Esto es una pequeña linea de linux para eliminar los archivos que están creados con más de 6 horas de antigüedad, se puede meter esta linea en el crontab para que limpie una carpeta cada X tiempo.

/usr/bin/find /tu_directorio/* -maxdepth 2 -mmin +360 -delete


Nota: si queréis que también elimine el directorio eliminar el asterisco final de la ruta.

Automatizar el eliminado con CronTab


0 6 * * *  /usr/bin/find  /home/www/tienda/descargas/ziptemporales/* -maxdepth 2 -mmin +360 -delete

Explicacion:
Limpiara la carpeta a las 6 de la mañana todos los dias y eliminará los archivos que tengan mas de 6 horas. Yo lo tengo funcionando en una carpeta que contiene zips que se tienen que eliminar una vez descargados.

0 (minuto 0, 00:00)
6 (hora 6, 06:00)
* todos los dias
* todos los meses
* cualquier dia de la semana
/usr/bin/find /home/www/tienda/descargas/ziptemporales/*  -maxdepth 2 -mmin +360 -delete    es el encargado de eliminar los ficheros

martes, 3 de abril de 2012

Selectores en jQuery

Selectores en jQuery

Los selectores en jQuery se suelen ver en dos categorías: selectores y filtros. A continuación veremos todos los selectores y filtros que se pueden utilizar para seleccionar elementos del DOM. Para más información y ejemplos pueden visitar la documentación oficial de jQuery sobre los selectores.

Selectores básicos

// Selectores básico en jQuery.

// Selecciona un elemento por ID.
// e.j.: selecciona un elemento: <span id="footer"><span>
$('#footer');

// Selecciona todos los elementos por nombre.
// e.j.: selecciona elementos: <table>
$('table');

// Selecciona todos los elementos por CLASS.
// e.j: selecciona los elementos: <span class="box"><span>
$('.box');

Selectores jerárquicos.

// Selectores jerárquicos en jQuery
// Selecciona todos los elementos descendiente de otro elemento
// especificado.
// e.j.: Selecciona los IMG descendiente de un DIV.
$('div img');

// Selecciona los elementos descendientes directos de otros.
// Esto quiere decir que solo se seleccionarán los primeros
// dentro de otros.
// e.j.: Selecciona los IMG descendientes directos de un DIV.
$('div > img');

// Selecciona los elementos que le siguen a otro elemento
// especificado.
// e.j.: Selecciona todos los IMG después de un DIV.
$('div + img');

// Selecciona todos los elementos primos que le siguen a otro
// elemento especificado.
// e.j.: Selecciona todos los IMG primos después de un DIV.
$('div ~ img');

Selectores de elementos formularios.

// Selectores de elementos de formularios

// Selecciona todos los elementos INPUT, TEXTAREA, SELECT
// y BUTTON.
$(':input');

// Selecciona todos los elementos INPUT de tipo "text".
$(':text');

// Selecciona todos los elementos INPUT de tipo "password".
$(':password');

// Selecciona todos los elementos INPUT de tipo "radio".
$(':radio');

// Selecciona todos los elementos INPUT de tipo "checkbox".
$(':checkbox');

// Selecciona todos los elementos INPUT de tipo "submit".
$(':password');

// Selecciona todos los elementos INPUT de tipo "image".
$(':image');

// Selecciona todos los elementos INPUT de tipo "reset".
$(':reset');

// Selecciona todos los elementos INPUT de tipo "button".
$(':button');

// Selecciona todos los elementos INPUT de tipo "file".
$(':file');

// Selecciona todos los elementos INPUT de tipo "hidden".
$(':hidden');

Filtros

Los filtros suelen acompañar los selectores previamente citados para realizar selecciones más específicas.

Filtros básicos

// Filtros básicos en jQuery.

$(':first'); // Selecciona el primer elemento.
$('div:first'); // Selecciona el primer DIV.

$(':last'); // Selecciona el último elemento.
$('div:last'); // Selecciona el último DIV.

$(':not(X)'); // Filtra los elementos usando un selector X.
$('div:not(#box)'); // Selecciona los DIV que no tenga un id="box".

$(':even'); // Selecciona los elementos pares.
$('div:even'); // Selecciona los DIV pares.

$(':odd'); // Selecciona los elementos impares.
$('div:odd'); // Selecciona los DIV impares.

$(':eq(X)'); // Selecciona un elemento de índice X.
$('div:eq(4)'); // Selecciona el quinto índice, contado de 0 a 4.

$(':gt(X)'); // Selecciona los elementos con índice mayor a X.
$('div:gt(2)'); // Selecciona todos los DIV después del tercero.

$(':lt(X)'); // Selecciona los elementos con índice menor a X.
$('div:lt(2)'); // Selecciona todos los DIV antes del tercero.

$(':header'); // Selecciona los elementos: h1, h2, h3 etc...

$(':animated'); // Selecciona todos los elementos animados
// Más detalles sobre animaciones en próximos capítulos.

Filtros de contenidos

// Filtros de contenidos en jQuery.

// Selecciona los elementos con el texto especificado
$(':contains(texto)');
$('div:contains(texto)');

// Selecciona los elementos que no tienen ni texto ni elementos.
$(':empty');
$('div:empty');

// Selecciona los elementos que tenga por lo menos un elemento
// especificado por un selector.
$(':has(selector)');
// e.j.: Selecciona todos los DIV que tenga un IMG de clase 'box'.
$('div:has(img.box)');

// Selecciona los elementos que tienen texto o elementos.
$(':parent');

Filtros de visibilidad

// Filtros de visibilidad en jQuery.

$(':hidden'); // Selecciona los elementos no visibles.
$('div:hidden'); // Selecciona los DIV no visibles.

$(':visible'); // Selecciona los elementos visibles.
$('div:visible'); // Selecciona los DIV visibles.

Filtros por atributos

// Filtros por atributos en jQuery.

// Selecciona los elementos que tenga el atributo especificado.
$('[atributo]');
// e.j.: Selecciona los elementos con el atributo HREF.
$('[href]');

// Selecciona los elementos que tenga el atributo especificado
// y el valor asociado.
$('[atributo=valor]');
// e.j.: Selecciona los elementos con el atributo HREF="blank.html".
$('[href=blank.html]');

// Selecciona los elementos que tenga el atributo especificado
// y no el valor asociado.
$('[atributo!=valor]');
// e.j.: Selecciona los elementos con el atributo HREF que no sea
// igual a "blank.html".
$('[href!=blank.html]');

// Selecciona los elementos que tenga el atributo especificado
// y que comienze con el valor asociado.
$('[atributo^=valor]');
// e.j.: Selecciona los elementos con el atributo HREF que
// comienze con"blan".
$('[href^=blan]');

// Selecciona los elementos que tenga el atributo especificado
// y termine con el valor asociado.
$('[atributo$=valor]');
// e.j.: Selecciona los elementos con el atributo HREF que
// termine en ".html".
$('[href$=.html]');

// Selecciona los elementos que tenga el atributo especificado
// y que contenga en cualquier parte el valor asociado.
$('[atributo*=valor]');
// e.j.: Selecciona los elementos con el atributo HREF que
// tenga en cualquier parte el valor "k.h".
$('[href*=k.h]');

// Selecciona los elementos que tenga los atributos especificados
// o filtros de atributos asociados.
$('[atributo1][atributo2][atributo3]');
// e.j.: Selecciona los elementos con el atributo HREF que
// comienze por "bla" y termine en ".html".
$('[href^=bla][href$=.html]');

Filtros descendientes

// Filtros descendientes en jQuery.

// Selecciona los descendientes de un elemento por índice, pares,
// impares o ecuación.
$(':nth-child(índice/par/impar/ecuación)');
// e.j.: Selecciona todos los IMG descendientes pares de un DIV.
$(':nth-child(even)');
// e.j.: Selecciona todos los IMG descendientes de tres en tres
// con un desfase de 1 de un DIV.
$(':nth-child(3n + 1)');

// Selecciona los primeros elementos descendientes de un
// elemento especificado.
$(':first-child');

// Selecciona los últimos elementos descendientes de un
// elemento especificado.
$(':last-child');

// Selecciona los elementos descendientes de un
// elemento especificado.
$(':only-child');

Filtros de formularios

// Filtros de formularios en jQuery.

// Selecciona los elementos de formularios que están activos.
$(':enabled');

// Selecciona los elementos de formularios que no están activos.
$(':disabled');

// Selecciona los CHECKBOXs que están chequeados.
$(':checked');

// Selecciona los OPTIONs seleccionado de un SELECT.
$(':selected');

Fuente:

http://mariuzzo.com/cursos/introduccion-a-jquery/capitulo-2-selectores-en-jquery/

lunes, 2 de abril de 2012

Ocultar las imágenes que hay dentro de un div, recorrer un div

Sencillo javascript que nos permite recorrer los elementos que contiene una etiqueta html.

a = document.getElementById('leoIdElement')
b = a.getElementsByTagName('img');
for (i=1;b.length;i++){
b[i].style.display='none';
}