Ho fatto una prova creando un client per la mailslot:

Client:

codice:
#include "stdafx.h"
#include <windows.h>
#include <stdio.h>

int _tmain(int argc, _TCHAR* argv[])
{
	LPSTR lpszMessage = "Messaggio di prova per MailSlot."; 
	BOOL fResult; 
	HANDLE hFile; 
	DWORD cbWritten; 
 
	hFile = CreateFile("\\\\.\\mailslot\\blort", 
		GENERIC_WRITE, 
		FILE_SHARE_READ,  // required to write to a mailslot 
		(LPSECURITY_ATTRIBUTES) NULL, 
		OPEN_EXISTING, 
		FILE_ATTRIBUTE_NORMAL, 
		(HANDLE) NULL); 
 
	if (hFile == INVALID_HANDLE_VALUE) 
	{ 
		printf("\s\n", "Errore nell'apertura della MailSlot");
		return FALSE; 
	} 
 
	fResult = WriteFile(hFile, 
		lpszMessage, 
		(DWORD) lstrlen(lpszMessage) + 1,  // include terminating null 
		&cbWritten, 
		(LPOVERLAPPED) NULL); 
 
	if (!fResult) 
	{ 
		printf("\s\n", "Errore nell'invio del Messaggio");
		return FALSE; 
	} 

	printf("\s\n", "Messaggio inviato!");

	fResult = CloseHandle(hFile); 
 
	if (!fResult) 
	{ 
		printf("\s\n", "Errore nella chiusura del file");
		return FALSE; 
	} 
 
	return 0;
}
Server:

codice:
#include "stdafx.h"
#include <windows.h>
#include <stdio.h>


int _tmain(int argc, _TCHAR* argv[])
{
	HANDLE		handle;
	LPCTSTR		errMsg;
	FILE		*uscita;
	char		FileDaScrivere[255] = "output.txt";

	/* Crea il mailslot */
	handle = CreateMailslot("\\\\.\\mailslot\\blort",
					0,
					MAILSLOT_WAIT_FOREVER,
					NULL);
	if (handle == INVALID_HANDLE_VALUE) 
	{
		TCHAR	strError[256];

		errMsg = "CreateMailslot ha fallito: %s";
print_err:
		// Prende il messaggio d'errore da Windows associato al numero d'errore
		FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, 0, GetLastError(),
                                      MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
                                      &strError[0], 256, 0);

		// Visualizza l'errore
		printf(errMsg, &strError[0]);

		// Chiude i mailslot aperti
		if (handle != INVALID_HANDLE_VALUE)
			CloseHandle(handle);

		return(-1);
	}

	while(1)
	{
		DWORD	msgSize;
		BOOL	err;

        //uscita = fopen(FileDaScrivere, "w");
        uscita = fopen(FileDaScrivere, "a+");

        if(uscita == NULL)
            return -1;


		/* Prende la dimensione del prossimo record */
		err = GetMailslotInfo(handle, 0, &msgSize, 0, 0);

		/* Controlla se c'è un errore */
		if (!err)
		{
			errMsg = "GetMailslotInfo failed: %s";
			goto print_err;
		}
			
		/* Controllo se msgSize è nullo */
		if (msgSize != (DWORD)MAILSLOT_NO_MESSAGE)
		{
			void *	buffer;

			/* Allocazione di memoria */
			buffer = GlobalAlloc(GMEM_FIXED, msgSize);
			if (!buffer)
				printf("Errore allocazione del blocco di memoria!");
			else
			{
				DWORD	numRead;

				/* legge il record */
				err = ReadFile(handle, buffer, msgSize, &numRead, NULL);

				/* Controlla se c'è un errore */
				if (!err)
					printf("ReadFile error: %d", GetLastError());
				/* Mi assicuro di aver letto tutti i bytes */
				else if (msgSize != numRead)
					printf("ReadFile non ha letto il giusto numero di bytes!");
				else
				{
					/***********************************
					***********************************
					Qui sotto le stampe su console e su file
					***********************************
					***********************************/

					// buffer contiene la stringa
					printf("%s\n", (char*)buffer); //scrive sulla console il cont. di buffer
					fprintf(uscita, "%s\n", (char*)buffer); //non scrive sul file
				}

				/* Libero il buffer */
				GlobalFree(buffer);
				fclose(uscita);
			}
		}

		/* pausa */
		Sleep(1000);
	}

	return 0;
}
Cosi funziona. Il problema stava proprio nell'apertura del file con l'opzione "w" ( che ad ogni ciclo svuota il file, al contrario di "a+" che aggiunge i messaggi alla fine del file ).