Che pasticcio...
Come spiegato di là, non puoi assegnare a sz2 il valore "" in quella maniera; devi usare _tcscpy (l'equivalente TCHAR di strcpy), oppure semplicemente azzerare il primo byte della stringa
Inoltre stai usando strcat invece di _tcscat: che senso ha usare la versione a char invece di quella per TCHAR? Lo stesso vale per la strncpy usata poco dopo. E perché allochi un array di char e poi lo assegni ad un puntatore a TCHAR? Dovresti allocare direttamente una stringa di TCHAR.
Inoltre, la strlen nella strncpy non ha nessun senso: strncpy si occupa autonomamente di calcolare quanti caratteri ci sono da copiare dalla stringa di partenza; piuttosto si usa strncpy per evitare di copiare più caratteri di quanti ne possa contenere la stringa di destinazione.
La cosa più sensata di tutte, poi, sarebbe lasciar stare strcat e _tcscat, e usare direttamente _tcsncpy per copiare la stringa nel buffer.
Infine, devi sempre ricordarti di deallocare la memoria allocata con new, e di gestire l'eventuale eccezione di allocazione che si può verificare.
codice:
TCHAR * sz2=NULL, * sz1=NULL;
try
{
sz2 = new TCHAR [500];
_tcscpy(sz2,"ciao");
sz1 = new TCHAR [500];
_tcsncpy(sz1,sz2,500);
MessageBox(NULL,sz1,"L'abuso di LOL deve morire",0);
}
catch(std::bad_alloc & ex)
{
MessageBox(NULL, "Impossibile allocare la memoria necessaria", "Errore", MB_ICONERROR);
}
delete [] sz2;
delete [] sz1;