A DLL is not a separate process but a dynamic library that's loaded into your application address space. That means, when the DLL calls printf or whatever output into the stdout/stderr handlers, will inherit the stdout/stderr handles or your running application and will behave indeed as you put printf inside your application.
If you want to capture the output of what's called from a DLL, you need to run it from a proxy EXE, that calls your DLL function. In that way, you can just redirect the stdout/stderr pipes to your process and do whatever you want.
By the way, in my opinion, this would be a totally wrong approach. If you use a DLL, you should have some sort of return codes from its function and not relay on its output on stdout.