questions about a C++ COM object accessed in Python via win32com

Alex Martelli aleax at aleax.it
Mon Sep 22 17:42:45 CEST 2003


T.T.H. wrote:

> Hi
> 
> I am coding a C++ COM object which I want to access in Python. For that
> I do have some detail questions and need help since I am not that familiar
> with the documentation itself of Python and win32com yet.
> 
> 
> 1.
> How do I know that...
> 
> import win32com.client
> 
> ...was successful or not?

If it fails, it raises an exception -- so, if you want to handle the
failure, you try this statement in the try clause of a try/except
statement.  That is reasonably similar to C++'s exception (syntax
apart), so the concept shouldn't be too alien.


> 2.
> In my COM object I do have the following C++ function:
> 
> STDMETHODIMP CMyTestObjekt::Connect()
> {
>   if (m_boolReadyToConnect == false) {
>     return E_FAIL;
>   }
>   return S_OK;
> }
> 
> How do I know in Python whether I got back a S_OK or an E_FAIL? Or is this

E_FAIL translates into an exception.

> whole concept wrong and I should better make an additional return value
> like:
> 
> MyFunktion(......., [out, retval] BOOL *pVal);  (declaration in the IDL)

This would be much more COM-idiomatic, unless the failure IS an exceptional
event, something that SHOULD not happen in a well-functioning system and
probably the result of mis-configuration or hardware malfunctioning.

> 
> 3.
> If I execute the following command...
> 
> MyObject = win32com.client.Dispatch("MyCOM.MySuperCOMObject")
> 
> ...what is the return value from which I know whether it was successful?

Guess...?-)  Yep: if it's not successful it raises an exception!

> Or what can be the ""content"" of "MyObject" afterwards?

If an exception wasn't raised, MyObject is an instance of some class
(you need not care about which one...) on which you can call methods
(which will be "proxied" to the actual C++-implemented COM object).

> 
> 4.
> If I have a function in Python in which I call the (global) COM Object,
> what "if" do I have to use to know whether the COM object already had
> been allocated? I tried the following but that didn't work:
> 
> def foo():
>   if MyObject == None:
>     print "COM not there yet"
>   else:
>     print MyObject.Message

If name "MyObject" has never been bound, trying to access it will...
I give you three guesses... *raise an exception*!

However, I _would_ suggest that in this case you set MyObject=None
at a global level and test as above (except, use "Myobject is None"
rather than ==) -- that is more idiomatic in Python.


Alex





More information about the Python-list mailing list