There is a Sysinternals tools called ListDll.exe that lists all the dlls loaded into memory and which process that has loaded them.
http://technet.microsoft.com/en-us/sysinternals/bb795533[
^]
It can be executed with arguments to just give output on a specific process name, pid, or dll name. A quick and easy solution is to periodically call ListDlls.exe from your program and parse its output. The catch is that ListDlls.exe must run as administrator.
Programatically (retreieve the info directly from your code), I am not really sure how to do it. Perhaps using hooking and undocumented windows API functions. But that is not for the faint of heart.