first_instance en Windows

Started by grisendo, February 01, 2010, 03:51:17 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

grisendo

Hola!

Ando con otro módulo para Bennu. Lo tengo ya hecho (y funciona) en Linux, pero cuando lo trato de compilar a Windows me da el siguiente fallo (obligo a --disable-auto-import):

undefined reference to _first_instance

Si no pongo --disable-auto-import, automáticamente se me pone a --enable-auto-import al primer fallo y me da warning, pero compila. Eso sí, first_instance es NULL y el módulo no funciona.

Sólo linko a libbgdrtm.dll, donde se supone que está (en Linux está en libbgdrtm.so), pero no va.

¿Alguien sabe cómo solucionarlo? :)

SplinterGU


wait... en que momento te da NULL? cuando la queres leer? hasta que los procesos no arrancan eso valdra NULL... digo esto, por si queres comprobar el valor en el init...

la lib es la correcta
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

grisendo

La función la llamo dentro de un proceso, la cosa rara es que funciona en linux, pero no en windows...

inicio
    proceso1

proceso1
    id1=proceso2
    id2=proceso3
    loop
        if(key(_f))
            JODIDA_FUNCION_QUE_DA_NULL_FIRST_INSTANCE_EN_WINDOWS_PERO_NO_EN_LINUX()
        end
        frame;
    end
...

Creo que los tiros van por _first_instance, que no me lo encuentra en libbgdrtm.dll (sacada de la última RC) y si le digo que lo ignore, el linker asume que está en el DLL pero que se llamará _imp_first_instance (dándome NULL en tiempo de ejecución). Es la única solución razonable que veo, pero no sé si es lo que ocurre de verdad ni sé cómo solucionarlo.

SplinterGU

estas incluyendo los include de bennu?
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

grisendo

Incluyo estos:

#include "bgddl.h"
#include "offsets.h"

El código completo está aquí: http://www.grisendo.com/proyectos/mod_freezer/mod_freezer.c
aunque casi me dé vergüenza enseñarlo porque he usado un vector gigante en lugar de estructuras
de datos más sofisticadas xDD

Implementa un congelador por niveles, y en Linux funciona. Al "congelar" un proceso le envía
la señal s_freeze la primera vez (las siguientes no). Cada vez que se "congela" más, no se envía
la señal s_freeze, pero se cuenta las veces que ha sido congelado. La función de "descongelar"
elimina una capa de congelación: si ya no quedan capas de congelación vuelve al proceso a su
estado original (no tiene por qué ser despierto, puede ser dormido). También tiene funciones
para ver el nivel de congelación de un proceso, y para congelar/descongelar un nivel todos los
procesos menos el que llama a la función (ideal para pausas).

Es que lo vi por el foro, Windgate comentó que conocía a uno que lo intentó implementar (sí,
ese soy yo xDD) pero lo intenté hace tiempo como módulo PRG y era un truño...

SplinterGU

caramba, no me digas que no publique la funcion para hacer pausas todavia... shit!
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Windgate

La idea de Grisendo fue buena (Data de hace 2 años si no me equivoco :D), los niveles de congelación eran especialmente útiles para poder trabajar con menús y submenús en los que interesa que los anteriores tengan varios niveles de congelación.

Grisendo es el que más ha trabajado el problema, en su día yo lo pensé hacer mediante puras FUNCTION para que bloqueen al menú anterior, pero fue sólo una idea que no llevé a cabo...

¿A qué pausa te refieres tú Splinter? No será el otro post que he leido sobre enviar señales a todos los procesos a la vez... :P
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

DCelso

se refiere a lo mismo pero hecho internamente.
Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

grisendo

Entonces eso ya está hecho? Eso me pasa por no leerme los CHANGE.txt de cada versión jaja. Pues nada, si está hecho ahí se queda el tema, y si no, me decís que lo intento arreglar para que rule en Windows también.

Yo probé a hacerlo con FUNCTION y PROCESS, pero no lo conseguí al principio, igual era porque la versión era muy vieja... tan vieja que empecé a hacerlo con fénix... En las versiones que usé había incongruencias tan gordas como que MIN_INTEGER era mayor que MAX_INTEGER!! Y tenía que generar vectores muchismo gordos y peludos. Al final algo conseguí, pero al intentar mejorarlo un poco (usar tablas hash) me petaba todo y ahí abandoné la idea... y eso que el único cambio que jodía el asunto era la función hash, que era la mayor tontería del mundo!!! HASH(N)=N... así que por eso he intentado hacerlo internamente.


SplinterGU

me refiero a esto... si si...

http://forum.bennugd.org/index.php?topic=1149.msg17259#msg17259

con esto se puede enviar una señal para congelar uno/todos/type/tree de procesos o enviar una señal para dormirlos a todos... y luego recuperar el estado anterior cuando querramos... solo se puede guardar 1 estado, y hasta que no restauremos podemos enviar las señales que querramos con el metodo normal (excepto kill) y luego recuperar el estado que guardamos previamente.

no es interno, son 2 funciones escrita en lenguaje BennuGD
Download Lastest BennuGD Release: http://www.bennugd.org/node/2