Comienza de nuevo. ¿Has visto las funciones de API que devuelven bloques de información (cadenas, búferes, etc.)? Por ejemplo, GetComputerName: http://msdn.microsoft.com/en-us/library/windows/desktop/ms724295(v=vs.85).aspx
Existe una razón por la que están estructuradas de esta manera. Tu función no debe presuponer la asignación de memoria y luego "darla" al proceso que llamó a la función. Más bien, el proceso que llama (tu aplicación PB) asignará espacio para el valor de retorno y la longitud de la memoria proporcionada; luego, tu función insertará el valor apropiado en ese búfer y devolverá la longitud del valor proporcionado. Deberás determinar cómo manejar (en tu función DLL) las situaciones en las que el llamante no proporcionó suficiente espacio.
Con respecto a tu código actual - Como Chris sugiere, tu función devuelve una cadena (realmente, un puntero a char). En PB declaraste que la función devolvía un solo char. PB está esperando un char, no un puntero, e interpreta parte del puntero devuelto como un char. Está haciendo exactamente lo que le dijiste que hiciera, desafortunadamente.