Una de romanos
Esta semana me ha dado, entre otras cosas, por el tema de la compresión de ficheros desde VB y estaba revisando la utilidad para crear ficheros CAB con la utilidad que hice en el 2000 en la que usaba un objeto COM (ActiveX) que se incluye con el sistema operativo: COM MakeCab 1.0 Type Library.
Pero resulta que intenté usarla, pero me dio error: Llamada a procedimiento no válido.
¡Jooor! ¿que será, será... lo que ha pasao?
Abro el proyecto e "intento" ejecutarlo desde el IDE de VB6 y... ¡error! la función CreateCab necesita otro parámetro más... ¡cachis! ¿será que ha cambiado la librería? ¿será ahora la versión 2.0?
Me pongo a revisar las referencias por si hubiera una nueva versión para el Windows XP... ¡pos no! sólo hay una COM MakeCab y sigue siendo la 1.0, así que me pregunté: ¿cómo es posible que ahora ese método tenga cuatro parámetros en vez de tres? y recapacité: se supone que cuando uno hace una nueva versión de una DLL de automatización (DLL ActiveX), debe mantener la compatibilidad binaria para que los ejecutables que usaran la versión anterior sigan funcionando con la nueva... o al menos, eso es lo que "recomiendan los manuales"... y entre otros de los que recomiendan esa "buena" forma de trabajar son la gente de Microsoft, pero claro... me imagino que dirán algo así: ¡para que coño voy a hacer las cosas como se deben hacer? eso es para el resto de los mortales... el que no sepa que esta "librería" ha cambiado... ¡que se joda! y sí, nos jodemos... bueno, más bien nos acordamos de toda la familia y demás ascendientes de más de uno...
Seguramente esta librería será una de las "indocumentadas" y por eso hacen lo que les da la gana sin avisar, pero... no es forma... por mucho Microsoft que sea...
Después de desahogarme un poco, sigamos con las explicaciones.
¿Qué ha cambiado?
Resumiendo... la forma de usar el método CreateCab ha cambiado y por tanto, para Windows 2000 hay que usarlo de una forma y para el Windows XP (y supuestamente para el 2003) se usa de forma distinta.
En Windows 2000 se usaba de esta forma: objMakeCab.CreateCab txtCab, 1, 1024
En Windows XP se usa de esta otra: objMakeCab.CreateCab txtCab.Text, 1, 1024, {False|True}Realmente los parámetros 2 y 3 pueden ser otros valores, aunque el segundo creo que sólo admite 1 y 0 (o True y False). Aquí lo importante son el primero y último parámetro.
¿El primero?, pero si es lo mismo que antes... (seguramente te preguntarás), sí, si, que te lo crees tú... piltrafilla, fíjate en que ahora se usa txtCab.Text en lugar de txtCab, es decir, tiene que ser un valor de tipo String, y aquí no valen las propiedades predeterminadas...
En cuanto al último, debe ser True o False, y aquí tampoco valen los valores "equivalentes", es decir, para True teóricamente podemos usar 1 o -1, y para False se podría usar un cero... ¡pues no! o usas un valor de tipo Boolean o te da el mismo error que antes...
¿Dónde está el código?
Eso me pregunto yo... a ver...
Pues no, no hay código, ya que el código a usar es el mismo que para el ejemplo de Windows 2000, solo que en lugar de usar .CreateCab txtCab, 1, 1024
ahora hay que usar: .CreateCab txtCab.Text, 1, 1024, False
o True, pero no he notado la diferencia...Lo que si te voy a dejar es el fichero de prueba ya compilado (vale, también te dejo el código fuente), para usarlo en Windows XP, como notarás cuando te lo bajes, he cambiado el nombre del proyecto y del formulario por si quieres tener las dos versiones, pero lo mejor, para el caso de que necesites tener una versión para XP y otra para 2000 es que uses una variable condicional, de forma que puedas hacer esto:
#If Windows2000 Then .CreateCab txtCab, 1, 1024 #Else .CreateCab txtCab.Text, 1, 1024, False #End IfDe forma que si quieres compilar la versión para Windows 2000 crees una constante así:
#Const Win2000 = True
Y si quieres usarlo para Windows XP, puedes comentar esa declaración o asignarle un valor False.Pues ya está todo... y no hagas demasiado caso a mis desvaríos que es que llevo nosecuantas horas currando...
Nos vemos.
Guillermo
Nerja, 11 de Febrero de 2005El ZIP con el ejecutable y el código fuente: gsMakeCabXP.zip 14.3 KB
Si quieres una utilidad para descomprimir ficheros CAB, te recomiendo que uses gsCabIt.