otra duda me surgio...como se cual estoy utilizando?, o sea, quien lo determina y como?
Eso dependera del entorno ... en VC++ por ejemplo las cadenas por defecto son ASCII y tenes que anteponer una L (asi: L"HOLA") para que la cadena sea Unicode. Mientras que el Kernel de Windows (gama NT) y la NTDLL.dll usan cadenas Unicode, por eso la API de Windows provee generalmente dos funciones con nombres ligeramente diferentes si se pasan parametros de cadena:
FuncionA (ANSI)
FuncionW (Wide)
Un ejemplo es GetModuleFileName y este es su prototipo:
DWORD GetModuleFileName(HMODULE hModule, LPTSTR lpFilename, DWORD nSize);
Si estamos trabajando en Unicode (hay unos defines UNICODE e _UNICODE creo que eran) el tipo LPTSTR sera una cadena LPWSTR (Wide) y sino sera LPSTR (ANSI).