¿Cómo puedo hacer que una aplicación de Visual Fox Pro funcione con distintos sistemas operativos?
Tengo una aplicación donde manejo los active por los errores que se me presentan son debido a las variedades y/o versiones de los sistemas operativos en que se desempeña la aplicación. Esto sucede cuando la aplicación se compila en un computador con versiones de OLE (OCX) y bibliotecas (DLL) distintas a las estaciones receptoras de dicha aplicación, por lo cual debe generarse nuevamente el ejecutable de la aplicación, señalando los objetos OLE que se hayan incluido dentro de la aplicación.Los archivos COMCTL32.OCX, COMCTL32:DLL y RICHT32.OCX, son responsables del buen funcionamiento de la estructuras Treeview (árbol), y el manejo de los archivos RTF respectivamente. Que debo hacer para que esta aplicación funcione bien en todos los sistemas operativos, windows 95,98,2000 server, xp.?
1 respuesta
Respuesta de miron
1
1
miron, ¡¡La vida es un constante movimiento, la quietud es la muerte!!
Con respecto de los OCX'S, no creo que haya problema ya que son estándar, a no ser que haya uno hecho específicamente para algún SO en particular. Yo utilizo cerca de 50 OCX'S y todos me han funcionado desde win98 hasta winxp, pasando por las versiones intermedias. Con respecto del EXE en FoxPro 2.x, necesitas tener instalado el kit de distribución para poder utilizar el comando BUILD EXE con las sintaxis siguiente: BUILD EXE <archivoexe> FROM <project> Saludos, si continua alguna duda no dudes en preguntarme, trataré de responderte a la brevedad, pero si eso es todo.
Agradezco mucho tu explicación, tengo que implementar y analizar tu respuesta, pero tengo otra inquietud, ¿como saber cuales son los ocx correctos para cada sistema operativo como windows 95,98, 2000 y xp. Es decir, necesito un comctrl.ocx y richtext.ocx que funcione de una forma estable en todos estos sistemas operativos. Cambiando de tema... Necesito generar un .exe en fox 2.6 y no he encontrado como hacerlo.
Yo no confío en la buena suerte, lo que te recomiendo es que hagas una rutina que verifique la existencia del control y la versión de él y en caso de ser diferente haga la instalación, por supuesto que tendrías que distribuir también tus archivos ocx. Habrá muchas maneras de registrar los controles, aquí te expongo la forma en que yo lo hago y se que te servirá de idea para hacer el tuyo: FUNCTION RegisterControl *-- Author: Paul Vlad Tatavu *-- This function registers an OCX/ActiveX control * or set of OCX/ActiveX controls based on the * name of file. *-- Note: It works for OLE servers too. *-- Parameters: * tcFileName = the name of the file that contains * the control(s), including the path. *-- Returns: * Logical TRUE if successful, FALSE otherwise. * Also returns FALSE if the file doesn't exist. *-- Call sample: * llRegistered = RegisterControl("c:\windows\system\comctl32.ocx") LPARAMETERS tcFileName LOCAL llSuccess IF FILE(tcFileName) DECLARE INTEGER DllRegisterServer ; IN (tcFileName) ; AS __DllRegisterServer__ *-- This function returns 0 if successful IF __DllRegisterServer__() = 0 llSuccess = .T. ELSE llSuccess = .F. ENDIF ELSE llSuccess = .F. ENDIF RETURN llSuccess ENDFUNC *RegisterControl PROCEDURE InstalaOcx ** verificar si los ocx estan registrados *---------------------------------------------------------------------- * Por ejemplo para registrar Foxhwnd.OCX, debemos copiar el archivo .OCX * en C:\Windows\System\ (Win95) ó C:\WinNT\System32\ (WinNT) y luego ejecutar: *---------------------------------------------------------------------- * C:\Windows\System\RegSvr32.Exe C:\Windows\System\Foxhwnd.ocx && En Win95 * ó * C:\WinNT\System32\RegSvr32.Exe C:\WinNT\System32\Foxhwnd.ocx && En WinNT *---------------------------------------------------------------------- * NOTA: VFP trae el archivo RegSvr32.Exe en C:\VFP (HOME()) *---------------------------------------------------------------------- * Pero en caso de que no se haya realizado la instalación o tengamos un version nueva * esta rutina se encarga de registralos en el sistema * Ahora vamos con la comprobación de la instalación de los controles ActiveX PUBLIC cRutaServ LOCAL cValorRegistro, laOCXLocal, laOCXServer, cFileLocal, cFileServ DIMENSION laOCXLocal[1], laOCXServer[1] cRutaServ = CurDir() * Está la tabla de los ActiveX a utilizar? IF !FILE(cRutaServ+'ACTIVEX\ACTIVEX.DBF') Then MESSAGEBOX("La tabla de registro de librerias OCX no existe",016,"No se puede continuar") RETURN .F. ENDIF USE (cRutaServ+'ACTIVEX\ACTIVEX.DBF') IN 0 ALIAS CX shared SELECT CX GO TOP IF Eof()Then MESSAGEBOX("La tabla de CONTROLADORES OCX esta vacía",016,"No se puede continuar") RETURN .F. ENDIF SCAN cValorRegistro = ALLT(LeeCadenaDeRegistro(HKEY_CLASSES_ROOT,ALLT(CX.cOleClass),"")) IF !ISNULL(cValorRegistro) Then * El control está registrado. Puede darse la circunstancia, de que a pesar de * estar registrado el control, el archivo OCX haya sido eliminado del directorio * del sistema de Windows. Lo comprobamos por si acaso. cFileServ = cRutaServ+'ACTIVEX\' +Allt(CX.cFileOCX) cFileLocal = oPrg_Disk_SystemDir()+Allt(CX.cFileOCX) IF !FILE(cFileLocal) Then *If oPrg_Disk_CopiaFile(cFileServ,cFileLocal,.F.) Then IF Copia_Archivo(cFileServ,cFileLocal,0) Then IF RegisterControl(cFileLocal) Then WAIT WIND 'Registrado control '+CX.cFileOCX NOWAIT ELSE WAIT WIND 'ATENCION:'+CHR(13)+'No se ha podido registrar el control '+CX.cFileOCX ENDIF ENDIF ELSE * El archivo OCX está en su sitio. Y todo está OK. ENDIF ELSE * El control no está registrado cFileServ = cRutaServ+'ACTIVEX\'+CX.cFileOCX cFileLocal = oPrg_Disk_SystemDir()+CX.cFileOCX IF !FILE(cFileLocal) Then *If oPrg_Disk_CopiaFile(cFileServ,cFileLocal,.T.) Then IF Copia_Archivo(cFileServ,cFileLocal,0) Then IF RegisterControl(cFileLocal) WAIT WIND 'Registrado control '+CX.cFileOCX NoWait ELSE WAIT WIND 'ATENCION:'+CHR(13)+'No se ha podido registrar el control '+CX.cFileOCX ENDIF ENDIF ELSE * El OCX ya se encuentra en el directorio del sistema local * Podría darse el caso de que se tratara de una versión distinta de la * que vamos a utilizar. IF ADIR(laOCXLocal,cFileLocal) = 1 AND ADIR(laOCXServer,cFileServ) = 1 * Comparamos las fechas IF laOCXLocal[1,3] # laOCXServer[1,3] *=oPrg_Disk_CopiaFile(cFileServ,cFileLocal,.F.) =Copia_Archivo(cFileServ,cFileLocal,0) ENDIF *- IF RegisterControl(cFileLocal) WAIT WIND 'Registrado control '+CX.cFileOCX NOWAIT ELSE WAIT WIND 'ATENCION:'+CHR(13)+'No se ha podido registrar el control '+CX.cFileOCX ENDIF ENDIF ENDIF Endif ENDSCAN USE in CX WAIT Clear Endproc Bueno compañero si es todo te agradezco que no olvides finalizar tu pregunta.