falonso2.cpp, cuya adecuada compilación producirá
el ejecutable falonso2.exe. Por favor, mantened los
nombres tal cual, incluida la extensión. Se trata de realizar
una práctica casi idéntica a la
segunda práctica de este año, pero
mediante un programa que realice llamadas a la API de WIN32.
libfalonso.a. La biblioteca se llamará
falonso2.dll.
int FALONSO2_estado_semAforo(int direcciOn):
Esta función devuelve el estado del semáforo
que se le especifica como argumento (HORIZONTAL
o VERTICAL). El estado devuelto será
ROJO, AMARILLO, VERDE
o NEGRO.
int FALONSO2_posiciOn_ocupada(int carril, int desp):
Verdadera, si la posición correspondiente al carril
y desplazamiento está ocupada por un coche.
Falsa, en caso contrario.
falonso2.h. Las funciones proporcionadas por la
DLL tienen prácticamente el mismo prototipo y funciónamiento que
las de la práctica segunda, salvo:
int FALONSO2_inicio(int ret)FALONSO2_:
int FALONSO2_fin(int *cuenta);
int FALONSO2_luz_semAforo(int direcciOn, int color);
int FALONSO2_inicio_coche(int *carril, int *desp, int color);
int FALONSO2_avance_coche(int *carril, int *desp, int color);
int FALONSO2_velocidad(int v, int carril, int desp);
int FALONSO2_cambio_carril(int *carril, int *desp, int color);
int FALONSO2_pausa(void);
void pon_error(const char *mensaje);
falonso2.dllfalonso2.dll
y el fichero de cabeceras falonso2.h.
falonso2.dll ver. 1.4:
Descárgalo de aquí.
falonso2.h ver. 1.4:
Descárgalo de aquí.
EVENTOS Y VALOR INICIAL: EC* (automático), EV (automático).
SEUDOCÓDIGO:
C V
=== ===
Por_siempre_jamás Por _siempre_jamás
{ {
W(EC) W(EV)
escribir_consonante escribir_vocal
Set(EV) Set(EC)
} }
Debéis indicar, asimismo, en el caso de que las hayáis
programado, las optimizaciones de código realizadas.
TerminateThread para acabar con
los hilos o TerminateProcess para acabar con
los procesos. El problema de estas funciones es que
están diseñadas para ser usadas solo en condiciones
excepcionales y los hilos mueren abruptamente.
Pueden dejar estructuras colgando, ir llenando
la memoria virtual del proceso con basura o no
invocar adecuadamente las funciones de descarga de la
DLL.
LoadLibrary, en
lugar de aparecer la pantalla de presentación, aparece
un mensaje que pone
"En DllMain".fprintf(stderr,...) a
un fichero, añadiendo al final de la línea de
órdenes
2>salida. De este modo, toda la información
aparecerá en el fichero salida para su
análisis posterior. No os olvidéis de incluir el
identificador del hilo que escribe el mensaje.
XXXX de la biblioteca. No consigo de
ningún modo acceder a ella.XXXX) por lo que veremos más
abajo. Para definir el tipo de esta variable
correctamente, debéis conocer cómo son los
punteros a función. En la
sesión quinta,
se describe una función, atexit.
Dicha función en sí ;no es importante para lo
que nos traemos entre manos, pero sí el argumento
que tiene. Ese argumento es un puntero a función.
Fijándoos en ese argumento, no os resultará
difícil generalizarlo para poner un puntero
a funciones que admiten otro tipo de parámetros
y devuelve otra cosa.
Notad, además, que, al contrario que
ocurre con las variables "normales",
la definición
de una variable puntero a función es especial
por cuanto su definición no va solo antes del
nombre de la variable, sino que lo rodea.
Tenéis que poner algo similar a:
#$%&%$ XXXX $%&$@;, es decir,
algo por delante y algo por detrás.
GetProcAddress.
Pero, ¡cuidado!, GetProcAddress
devuelve un FARPROC, que sólo
funciona con punteros a funciones que devuelven
int y no se les pasa nada
(void). Debéis hacer el
correspondiente casting. Para ello,
de la definición de vuestro puntero, quitáis
el nombre, lo ponéis todo entre paréntesis
y lo añadís delante de
GetProcAddress, como siempre.
XXXX como nombre al puntero,
ahora no se diferenciarán en nada vuestras
llamadas a la función respecto a si dicha
función no perteneciera a una DLL y la
hubierais programado vosotros.
.h si llamáis a vuestro
fichero fuente con extensión .c. Llamadlo
siempre con extensión .cpp.
libc (malloc
y free). Son funciones que no están
sincronizadas, es decir, no se comportan bien
en entornos multihilo. O bien las metéis en una
sección crítica o, mejor aún, tratad de evitarlas.
error XXXXX: 'FuncionW': no se
puede convertir de 'const char[X]' a 'LPCWSTR'.
El motivo del error es que, por defecto, esa versión
de Visual Studio supone que deseáis usar UNICODE
(caracteres de 16 bits) en lugar de los normales
(caracteres de 8 bits). La solución pasa por
transformar el código fuente para que se ajuste
a la programación en UNICODE de Microsoft o
decirle a Visual Studio que no, que no queréis
trabajar con UNICODE. Unos compañeros vuestros
escriben diciendo que si en la configuración
del proyecto seleccionáis
"Juego de Caracteres->Sin establecer", se soluciona.
int _tmain(int argc, _TCHAR* argv[])GetProAddress.
windows.h
antes que el fichero de cabeceras de la DLL