Solucionando problemas con librerias de Visual C
(1009 palabras totales en este texto) (11799 Lecturas) 
Sobre los problemas de los
"runtime" de Visual C
---------------------------------------------------------------------------------------
Prácticamente, todos los productos de Windows (sean de Microsoft o
de terceros) están escritos en Visual C++ (alguno pocos en Basic, pero
este no se utiliza en programas serios debido a su pérdida de prestaciones).
Bien, el problema reside en que Microsoft va actualizando el "runtime"
de Visual C++ a la ultima versión, bien en los nuevos sistemas operativos,
o bien en los parches a los sistemas. Pero por otra parte, algunos "terceros"
tienen la insana costumbre de instalar también el runtime de C o las
librerías de clases. Si este "tercero" intenta machacar los
que hay en la carpeta de Windows, no hay problema ya que el propio Windows"protegerá"
sus archivos y no permitirá el machaque y por tanto, nada se estropeará.
El problema reside en si este "tercero" instala en su propia carpeta
de instalación este runtime. Lo veremos más adelante.
Antes de nada, vamos a definir lo que es el "runtime". El runtime
es una serie de DLL's que cualquier programa escrito y compilado en C o C++
necesita para su ejecución. Igualmente existen las librerías
de clases (MFC). Las DLL's clásicas del runtime y librerías
de clases son:
msvcrt.dll
msvcrt20.dll
msvcrt40.dll
msvcirt.dll
msvci70.dll
msvci70d.dll
msvcp50.dll
msvcp60.dll
--------
mfc40.dll
mfc40u.dll
mfc42.dll
mfc42u.dll
mfc70.dll
mfc70u.dll
--------
Recordemos que una DLL tiene el concepto de Librería Dinámica
y que normalmente si es invocada por distintos programas, sólo estará
una vez en memoria. Es decir, si un programa la necesita, ejecuta la función"LoadLibrary".
Si la DLL está en memoria, Windows no la cargará y la usará.
Si no está la cargará.
Imaginemos ahora dos programas que se ejecutan al inicio de Windows (o dos
servicios). Uno de ellos carga el runtime de C: (o alguna de sus librerías).
El otro que se carga a continuación también las necesita, y
al cargarlas, como el sistema se da cuenta que ya están en memoria...
no hace falta cargarlas y solamente usa la que esté en memoria.
Ahora bien, imaginemos que ese primer programa que se carga, es de un tercero
de los que nos "han metido" un viejo runtime de C en su carpeta
privada. Como se ejecuta el primero, cargará un runtime de C (o una
librería de clases) vieja. Esta ya se queda en memoria y a partir de
entonces, todo lo que se cargue estará usando un viejo runtime de C,
aunque Windows tenga el "último" en sus carpetas Windowssystem32.
Por tanto, al tener la desgracia que ese servicio o ese programa de terceros
se haya cargado el primero, hará que todo el sistema funcione con algún
problema (o con muchos en ese momento y tengamos que reiniciar...).
Curiosamente, si reiniciamos, puede que no suceda el problema. ¿Por
qué?..... porque el orden de carga de programas y servicios no siempre
es el mismo, y puede que tengamos la suerte que la siguiente vez se cargue
con anterioridad un servicio correctamente realizado o del propio Windows,
el cual cargará correctamente el runtime del propio Windows
Esta es una de las causas de errores aleatorios y que nos dan la sensación
a veces de que Windows se comporta de manera diferente en cada reinicio.
Por curiosidad, podéis buscar en todo vuestro disco las DLL's anteriores
y ver en cuantos sitios aparecen (solo son correctas todas las que aparezcan
dentro de la carpeta de Windows y sus subcarpetas). Con el botón derecho
sobre ellas podréis verificar la versión y os sorprenderá
el ver cuántas veces las tenéis repetidas fuera de la carpeta
Windows en vuestro sistema, y lo que es más grave...... las diferentes
versiones que los terceros tienen la insana costumbre"de meternos"....
¿Cómo solucionarlo?
Machacando con las de XP las DLLs de terceros (by Alezito ;)
O, ¿porqué no.... simplemente renombrarla (con extension DL
en vez de DLL por ejemplo), y reiniciar a ver si funciona todo?.... y si vemos
que funcionan y funcionará mejor de lo que creemos.... posteriormente
ya las borraremos... ;-)) (by JMT)
Un saludo,
--
José Manuel Tella Llop
|