Comece de novo. Você viu as funções de API que retornam blocos de informações (strings, buffers, etc.)? Por exemplo, GetComputerName: http://msdn.microsoft.com/en-us/library/windows/desktop/ms724295(v=vs.85).aspx
Existe uma razão pela qual elas são estruturadas dessa maneira. Sua função não deve pressupor a alocação de memória e então "dar" ao processo que a chamou. Em vez disso, o processo chamador (sua aplicação PB) irá alocar espaço para o valor de retorno e o comprimento da memória fornecida; então, sua função inserirá o valor apropriado nesse buffer e retornará o comprimento do valor fornecido. Você terá que determinar como lidar (em sua função DLL) com situações em que o chamador não forneceu espaço suficiente.
Em relação ao seu código atual - Como Chris sugere, sua função está retornando uma string (na verdade, um ponteiro para char). No PB, você declarou que a função retornava apenas um char. O PB está esperando um char, não um ponteiro, e interpreta parte do ponteiro retornado como um char. Ele está fazendo exatamente o que você disse para fazer, infelizmente.