Ayuda para un programa antiguo

Expertos, tengo un programa desarrollado en clipper para DOS, es antiguo y solo tengo el exe, es decir no tengo el código fuente, lo que sucede es que solo trabaja en pentium 1 o más antiguas, ya lo probé en pentium II, Pentium III y Pentium 4, exactamente con la misma configuración, dos puro, win98 y winxp. SOLO TRABAJA en la Pentium I o 486, en las otras me sale DIVIDE BY CERO, hay alguna forma de resolverlo, lo necesito hacer correr en una Pentium 4. Gracias

1 Respuesta

Respuesta
1
Tengo una ultima alternativa ...
Crea el acceso directo en xp, luego clic derecho en propiedades, en la ficha COMPATIBILIDAD y en modo de compatibilidad selccionalo y toma de la lista w95 o w98, tal vez esto te funcione ...
Antes que nada, gracias por el interés, pero mi problema es que no tengo el código fuente (solo tengo el ejecutable), entonces no puedo ni modificar el código ni recompilar el programa), el programa corre en DOS no necesita windows para nada (aunque lo probé en win98 y winxp), en pentium 1 o anterior con solo DOS trabaja bien, en pentium 3 o posterior también solo con DOS me sale DIVIDE BY CERO, nunca me había pasado algo así, tal vez haya una forma de emular un procesador antiguo o configurar un entorno en algún windows para que logre máxima compatibilidad hacia atrás. Gracias.
Nota. Lo probé en WIn98 en una pentium 1 y trabaja muy bien.
Tal vez te pueda dar una luz a la solución a tu problema de clipper ... clipper esta escrito para un entorno de 16 bits ... no de 32bits ... pero ...
Si la función que requiere está disponible en una DLL, puede establecer un vínculo con la biblioteca y llamar a sus funciones. Antes de llamar a una función de DLL tiene que determinar su protocolo de llamada, incluidos el nombre de la función, el número y los tipos de datos de sus parámetros y el tipo de datos del valor que devuelve.
En Visual FoxPro, sólo puede usar bibliotecas DLL que se hayan escrito para un entorno de 32 bits. Sin embargo, si necesita acceso a una DLL de 16 bits, puede llamarla mediante funciones disponibles en Foxtools. Fll. Para obtener más detalles, vea la ayuda para Foxtools (Foxtools. Chm).
Para llamar a una función de DLL
Registre la función de DLL mediante el comando DECLARE - DLL. Los nombres de función distinguen mayúsculas de minúsculas.
Nota Si especifica WIN32API como nombre de biblioteca, Visual FoxPro busca la función de la DLL de Windows de 32 bits en Kernel32.dll, Gdi32.dll, User32.dll, Mpr.dll y Advapi32.dll.
Llame a la función de igual forma que llamaría a una función de Visual FoxPro.
Por ejemplo, el siguiente programa registra la función GetActiveWindow( ) de la DLL del sistema USER de Windows, que muestra el controlador de la ventana principal de Visual FoxPro. GetActiveWindow( ) no requiere parámetros y devuelve un valor entero:
DECLARE INTEGER GetActiveWindow IN win32api
MESSAGEBOX(STR( GetActiveWindow() ) )
La DLL que contiene la función que registra debe estar disponible en el directorio predeterminado, en los directorios Windows o System, o en la ruta de acceso de DOS.
Si la función que desea llamar tiene el mismo nombre que otra función ya disponible en Visual FoxPro (una función nativa o una función de DLL declarada previamente), puede asignar un alias a la función con el nombre duplicado y, a continuación, llamarla con el alias.
DECLARE INTEGER GetActiveWindow IN win32api AS GetWinHndl
MESSAGEBOX(STR( GetWinHndl() ) )
Las funciones de DLL vinculadas permanecerán disponibles hasta que salga de Visual FoxPro, por lo que sólo tiene que declararlas una vez por sesión. Si no pretende volver a llamar a las funciones de una DLL, puede ejecutar el comando CLEAR DLLS para quitarla de la memoria y liberar recursos.
Nota Ejecutar CLEAR DLLS borra de la memoria todas las funciones de DLL declaradas.
Transferir parámetros a una DLL
Cuando registra una función de DLL, tiene que especificar el número y el tipo de datos de sus parámetros. De forma predeterminada, los datos se pasan por valor. Puede hacer que un parámetro se pase por referencia si incluye un signo at (@) delante del parámetro.
En general, las funciones de DLL siguen las convenciones de tipos de datos usadas en C, que son diferentes de las usadas en Visual FoxPro. Por ejemplo, las funciones de DLL no admiten un tipo de datos Date (fecha) o Currency (moneda). Si los datos que pasa a una función de una DLL están en un tipo de datos no admitido por la función, tiene que convertirlos a un tipo de datos apropiado antes de pasarlos. Por ejemplo, puede convertir una fecha a un formato numérico de fecha Juliana con comandos como el siguiente:
cDate = sys(11, date())
nDate = val( cDate )
Algunas funciones de DLL requieren parámetros más complejos, como estructuras o matrices. Si la función requiere un puntero a una estructura, debe determinar la distribución de la estructura y emularla como una cadena en Visual FoxPro antes de transferirla a la función de DLL o recibirla de ésta. Por ejemplo, la función del sistema de Windows GetSystemTime( ) espera un puntero a una estructura formada por ocho palabras o enteros de 16 bits sin signo que indican el año, el mes, el día, etc. La estructura se define de esta forma:
typedef struct _SYSTEMTIME {
WORD wYear ;
WORD wMonth ;
WORD wDayOfWeek ;
WORD wDay ;
WORD wHour ;
WORD wMinute ;
WORD wSecond ;
WORD wMilliseconds ;
} SYSTEMTIME
Para transferir datos entre Visual FoxPro y la función GetSystemTime( ), tiene que crear un búfer de cadena de 40 bytes (formado inicialmente por espacios) y, a continuación, transferir la dirección de esta cadena a la función para llenarla. Cuando se devuelve la cadena, debe analizarla en incrementos de 2 bytes para extraer los campos individuales de la estructura. El siguiente fragmento demuestra cómo podría extraer tres de los campos de la estructura:
DECLARE INTEGER GetSystemTime IN win32api STRING @
cBuff=SPACE(40)
=GetSystemTime(@cBuff)
tYear = ALLTRIM(STR(ASC(SUBSTR(cBuff,2)) * ;
256 + ASC(SUBSTR(cBuff,1))))
tMonth = ALLTRIM(STR(ASC(SUBSTR(cBuff,4)) * ;
256 + ASC(SUBSTR(cBuff,3))))
tDOW = ALLTRIM(STR(ASC(SUBSTR(cBuff,6)) * ;
256 + ASC(SUBSTR(cBuff,5))))
Para obtener más información, puede examinar el formulario de ejemplo Systime.scx del directorio ...\Samples\Solution\Winapi de Visual FoxPro. Para ver otros ejemplos de cómo pasar parámetros a funciones de DLL, vea el programa Registry. Prg que se encuentra en el directorio ...\Samples\Classes de Visual FoxPro.
Si los datos con los que está trabajando en Visual FoxPro se encuentran en una matriz, debe crear un bucle en la matriz y concatenar los datos en una única cadena que represente una matriz de tipo C antes de transferirlos a la función de DLL. Si la función de Windows espera valores de 16 bits o de 32 bits, tiene que convertir los valores a sus equivalentes hexadecimales antes de concatenarlos en una cadena. Al transferir la cadena que contiene los datos de la matriz, Visual FoxPro pasa la dirección de la variable de tipo cadena a la DLL, que puede manipularla como una matriz. Para ver un ejemplo de esto, vea el formulario de ejemplo Syscolor.scx que se encuentra en el directorio ...\Samples\Solution\Winapi de Visual FoxPro.
Ya lo probé, y por degracia no funciona Snif... snif, modifique las propiedades del acceso directo en WinXP y Win98 y en ninguna funciona (lo peor es que en Pentium 1 o anterior trabaja de las mil maravillas... que joda.)... Gracias de todas maneras por el interés.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas