what's up TTH... i don't know what COM objects are, and I'm really shaky on C++ (i hate it, actually)... i'll suggest what I think, but there are probably better ways that i'm unaware of. at least, I think I can help you with the first question for sure.
(1)
to know if your import stmt went through ok, just use dir().
ie:
--------------------------------------
import cgi
if 'cgi' in dir():
print "yep, it's there"
--------------------------------------
OR, you could just try to use a function or call an object of the module you imported inside of a 'try' block, with an 'except' block right after it in case the import stmt didn't go through. it wasn't imported correctly, your 'except' code will execute, because you'll get a NameError. of course, the thing with this second way is that you'll have to be absolutely certain that the object/function that you call from that module in your try block exists in the module you want to import, and that you're using it correctly.
(2)
do you know before hand if E_FAIL has a constant value? the way you have it used in the code, it seems like E_FAIL should be readily distinguishable from S_OK, but I could be totally wrong. I don't know what the contexts of either are, nor what kind of variable, etc etc... if my assumptions are correct (time has taught me the chances are slim). alternatively, you could return an array of length 2 with the first index indication true or false (false would be E_FAIL, I guess), and the second index being the value of E_FAIL or S_OK, correspondingly. that way, you can just check the first index of the returned array in python.
(3) & (4)
sorry, can't help ya there

i don't know enough about the flow or context of your code to be able to suggest anything that'd be useful.
hope i've been at least somewhat helpful. have a good day.