Remakes en Fenix y Vista. Posible solución

(Casi) cualquier cosa que quieras compartir será bienvenida por la comunidad

Moderador: Sir Cilve Sinclair

Responder
Gandulf
Nonamed
Mensajes: 1067
Registrado: Lun May 07, 2007 10:06 pm

Remakes en Fenix y Vista. Posible solución

Mensaje por Gandulf » Sab Sep 29, 2007 12:24 pm

Creo que los que hacer remakes en Fenix deberían mirar esto:

[Copiado de Foros DIVSite, post de Josebita]
======================================================
Llevo un ratillo mirando el problema este de que en el Vista no
funciona Fenix.
Por lo que he leído en internet, creo el problema está en que la nueva
versión de Vista se ha vuelto bastante más restrictiva con los
argumentos que se le pasan a fopen();
Por lo que he visto, el compilador cuando quiere abrir un fichero,
llama a la función file_open(); del fichero "common/files.c", que
cambia las barras feas de directorio ("") por las barras bonitas ("/")
y llama a open_raw() del mismo fichero repetidas veces según un patrón
hasta que en alguna de ellas abre el fichero, o hasta que desiste y
suelta un error.
Por lo que he podido ver, llama a la función con el modo de apertura
"rb0", los dos caracteres primeros son el modo de apertura de sólo
lectura compatible con sistemas viejos y el "0" es un caracter interno
de Fenix que dice que el fichero no debe intentar abrirse como
comprimido.
Creo que el problema viene porque Windows Vista rechaza el modo "rb0",
en lugar de asumir que se debe tratar de "rb" unicamente, por lo que
he leído por seguridad.
He probado a hacer una pequeña rutina que elimina ese último "0" antes
de llamar a fopen, y creo que ya funciona.
El código no es ninguna maravilla, pero bueno, lo que importa es la
idea.
En resumen, lo que hay que hacer es cambiar la función open_raw del
fichero ese por:
Código:
static int open_raw (file * f, const char * filename, const char *
mode)
{
int i=0;
int j=0;
char openmode[5];


if (!strchr(mode,'0'))
{
f->type = F_GZFILE ;
f->gz = gzopen (filename, mode) ;
f->eof = 0 ;
if (f->gz) return 1 ;


}


//My chapuz
for(i=0; i+j<strlen(mode); i++) {
if(mode == '0')
j++;
openmode = mode[i+j];

}


while(i<strlen(openmode)) {
openmode = '?';
i++;

}


f->eof = 0 ;
f->type = F_FILE ;
f->fp = fopen (filename, openmode) ;
printf("Trying to open %s with mode %sn", filename, openmode);
if (f->fp) return 1 ;
return 0 ;

}


============================================================
Un saludo,

Gandulf

Responder

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 15 invitados