Alexander Eisenhuth schrieb:
> Hello list,
> 
> I'm having a problem with a python COM Excel client that rarely gets the 
> exception pywintypes.com_error with the error code -2147417846. (means Excel 
> is 
> busy) Here the python code of the exception handling:
> 
> [...]
> try:
>       # write a excel cell
> [...]
> except pywintypes.com_error, ex:
>       if ex[0] == -2147417846:
>               time.sleep(1.0)
>               # retry write?
> [...]
> 
> My first approach was to retry the writing to the excel cell. But that ends 
> in a 
> hanging Excel application (probably a deadlock).
> 
> After a little research I found this post:
> 
> http://social.msdn.microsoft.com/Forums/en-US/vsto/thread/70ef972b-51b6-4ece-a4af-d6b4e111eea5
> 
> "[...] If you don't register a MessageFilter yourself (by calling 
> CoRegisterMessageFilter), you will get default behavior which will be to fail 
> the call if it gets rejected.  .Net converts the failure HRESULT to an 
> exception.  To deal with the possibility of the server being busy when you 
> try 
> to call, you need to implement IMessageFilter::RetryRejectedCall in your 
> client 
> code and also register the message filter.  In most cases, you will just need 
> to 
> wait for a few seconds and then retry the call--generally that will be 
> sufficient time to enable Word to finish whatever it is doing so it can 
> handle 
> your call.  However, if the instance of Word that you are controlling could 
> possibly visible, you might want to add additional logic to display the 
> OLEUIBUSY dialog after some amount of time has passed to notify the user that 
> you are waiting on Word to do something and give them the opportunity to help 
> the process.  For example, as Misha mentions, Word will reject all incoming 
> calls if a modal dialog box is up.  Therefore, in that situation, you would 
> be 
> blocked indefinitely until the dialog is dismissed. [...]"
> 
> As this part of the COM API (IMessageFilter, CoRegisterMessageFilter) isn't 
> included in pywin32 I don't see a possibility to do that, or?

If it is really possible to do this on the client side, you can try
to implement the message filter and call CoRegisterMessageFilter
with comtypes.

> Did anybody else have to deal with that problem?

Yes, we had this in our company with MFC applications.  Fortunately, these
were our own and we 'fixed' them by implementing a message filter inside
the applications, on the server side.


-- 
Thomas

_______________________________________________
python-win32 mailing list
python-win32@python.org
http://mail.python.org/mailman/listinfo/python-win32

Reply via email to