Semantic Designs C and C++ test coverage tools can do this for MS source files. [There's a version that works with GCC, too.]
Along with running the instrumenter on the DLL source code, you'll need to add custom logic in the dll shutdown logic to dump test coverage data (or some other place that the dll executes rarely but reliably). The docs explain how to do it. This enables the DLL to collect and report test coverage data on itself without any need for the .exe file to know this is happening.
[To answer a question from another place: This tool will also let you perform multiple executions on typical input data, or, with minor adjustments, on individual tests, and collect coverage data for each run/test separately. You can inspect the coverage for the individual runs, or the tool can combine the data from individual runs to tell you overall coverage of all runs, or you can compare what one run covers versus another.]
Since this is my company, don't take this as a recommendation,
just a statement that these tools exist.