Saturday, July 2, 2011

Excel y DDE (Dynamic Data Exchange)

Hace tiempo me encontré con un problema en el que era necesario desactivar de manera automática la opción en Excel "Omitir otras aplicaciones que usen Intercambio dinámico de datos (DDE)".

Analizando un poco como es que se almacenaba esta opción en Excel encontré que se guarda en la llave de registro HKCU\Software\Microsoft\Office\12.0\Excel\Options -> Options -> REG_DWORD Datos, la cual tiene los siguientes valores para esta opción en específico.







Habilitado Omitir DDE
0x00000017
00010111
Deshabilitado Omitir DDE
0x00000057
01010111
Lo único que cambia es el séptimo bit, por lo que para hacerlo de forma automática habrá que verificar ese bit, si la opción esta habilitada (el bit esta en cero) habrá que deshabilitarla (poner el bit en uno).

El código en NSIS que realiza lo anterior queda de la siguiente forma:

CRCCheck On
!include "${NSISDIR}\Contrib\Modern UI\System.nsh"

Name "Excel_DDE"
OutFile "Excel_DDE.exe"
Set Compressor "bzip2"
SilentInstall silent

RequestExecutionLever user

Section "install"
ReadRegDWORD $0 HKCU "Software\Microsoft\Office\12.0\Excel\Options" "Options"
#0x40 = 01000000
IntOp $1 $0 & 0x40
IntCmp $1 0 igual
goto done
igual:
IntOp $1 $0 | ox40
WriteRegDWORD HKCU "Software\Microsoft\Office\12.0\Excel\Options" "Options" $1
done:
SectionEnd

¿por qué NSIS? es la forma más rápida que encuentro para generar un archivo EXE que modifique llaves del registro.

ProcessMonitor
A mi punto de vista una muy buena herramienta que ayuda a ver los archivos, llaves de registro, opciones en línea de comandos, etc. que ocupa un programa. (Fue lo que ocupé para encontrar la llave de registro)
http://technet.microsoft.com/en-us/sysinternals/bb896645

NSIS
http://nsis.sourceforge.net/Main_Page