A ver, cuando tú escribes un programa, ese se compila, y el código en ensamblador espera los parámetros de una determinada forma. Por ejemplo, el código de un procedimiento podría buscar el primer parámetro en la cima de la pila, el segundo debajo de ella, etc. O al revés: el último en la cima, el penúltimo debajo... Otro modo sería que estuvieran en los registros del procesador, y cosas así.
Entonces cuando tú haces una función que vas a exportar en una DLL (o sea que tu función va a estar dentro de una DLL para que se llame desde cualquier otro programa) es necesario especificar como espera tu función los parámetros. Así si luego cualquiera escribe un programa en Visual C, en Visual Basic, o en lo que sea que utiliza esa DLL, el _compilador_ sabrá dónde diablos tiene que darle los parámetros a tu función en la DLL.
Lo del #define... eso es problema de Microsoft. Supondrá que si pone WINAPI queda claro que estás haciendolo igual que lo hacen las funciones del API de Windows, y no te preocupas por nada más. Pero en tu caso no fue así :-)
Espero que te sirva!