Esto es un problema de enfoque, hay que leer sobre ANSI vs Unicode antes de continuar sin entender lo que se esta haciendo ... si estan en Unicode tienen que usar las funciones de cadena para Wide char (wcslen por ejemplo). daryo si eso te compila es por una razon: estas en ANSI; igual tiene el mismo problema que el codigo original, cadena es un puntero indefinido (a char en tu caso, a wchar_t si se definiera Unicode en el proyecto y ahi ya no compilaria mas).
MSDN: Unicode and ANSI names GetWindowTextW (Unicode) and GetWindowTextA (ANSI)
Kaxperday: te repito, ese casting es un error logico, si estas en Unicode y por eso usas GetWindowTextW le estas diciendo a la funcion que tu buffer tiene 500 caracteres y no es cierto si usas char[500] y ese casting, tenes 250 caracteres.
MSDN: Unicode and ANSI names GetWindowTextW (Unicode) and GetWindowTextA (ANSI)
Kaxperday: te repito, ese casting es un error logico, si estas en Unicode y por eso usas GetWindowTextW le estas diciendo a la funcion que tu buffer tiene 500 caracteres y no es cierto si usas char[500] y ese casting, tenes 250 caracteres.