Forse ho bevuto troppo ma unicode non è sempre un char*?vabbhe?
se devi inviare te il messaggio allora sei te ad avere il parametro buf da inviare e quindi sei a conoscenza di buf,soluzione basta un cast.
Il problema forse è la ricezione,quando ti arriva il messaggio magari non sai cosa contiene buff.
Dato che "una volta" non esisteva void* ma esisteva semplicemente char*,poi un bel giorno si son detti (quelli della iso...) che era meglio chiamarlo void* per non confondere i programmatori cosi hanno fatto,rimane poi una considerazione molto importante,con il tipo char* puoi rappresentare tutti i tipi di dato,perchè char è il piu semplice ovvero 1byte quindi char* è un puntatore ad un byte e quindi non potrai mai avere nessun genere di perdita di informazioni facendo un casting al tipo char.
void *buff=(void*)getbuff(.....);//immaginaria
char *dato=(char*)buf;
ora con dato potrai fare ciò che vuoi e una volta finito potrai ripassarlo alla funzione senza problemi:
send(MY_DEST,OBJ,(void*)dato,sizeof(dato));