¿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
1
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.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas