But if your idea starts of with funcA in the dll without the callback you are too late because, as you mention yourself, the dll cannot reach functions in the exe at compile time. This means that you have to give the function address as a parameter along with the others in funcA.
So funcA in the dll can callback to the given function of funcB because you supply it with the address of that function when calling it from the exe.
void funcA(funcB_callback funcB, ...)
{
funcB(...);
}
So it can work because the function definition (or signature) is known in both exe and dll and you provide the dll with the runtime function pointer at runtime so the dll can actually call it.
It is just like using the EnumWindows winapi where you also provide it a callback function pointer that is called for each window.
http://msdn.microsoft.com/en-us/library/ms633497%28v=vs.85%29.aspx[
^]
Good luck!