Hi Thomas,
thanks for your reply. I used the following code to keep the server
alive:
class OpcServer(CoClass):
ref_count = 0
(...)
def __init__(self):
(...)
if Settings.KEEP_ALIVE and self.ref_count == 0:
# This will keep the server alive even if all clients
are
disconnected
self.IUnknown_AddRef(None)
self.ref_count += 1
The disadvantage is, that one server instance which is the first that is
created by a client will stay alive as a zombie rather than the object
is closed and the COM application stays in a listening mode if if it
would have been started using "-embedding". I guess this is what using
CoLockObjectExternal would achieve. However, as a quick fix it did work.
Thanks a lot.
> -----Ursprüngliche Nachricht-----
> Von: Thomas Heller [mailto:[email protected]]
> Gesendet: Donnerstag, 12. April 2012 22:49
> An: [email protected]
> Betreff: Re: [comtypes-users] How to keep-alive a COM server without
clients
> connected?
>
> Am 12.04.2012 09:55, schrieb Jan Wedel:
> > I think IClassFactory.LockServer is exactly what I'm looking for.
> > However, I do not know how, when and where I should be able to
access
> > this method. I checked the sources and found that the factory
instance
> > gets lost somewhere in COMObject. [...]
>
> You could somehow patch comtypes to make the factory instance
available in the
> COM object that it has created, but there are probably much easier
ways.
>
> You could increment the COM refcount of your object from the object
itself, by
> calling AddRef() on it. In the COMObject base class, and by
comtypes-magic,
> the method that must be called is self.IUnknown_AddRef(None). Calling
> self.IUnknown_Release(None) will then decrement the refcount again if
your are
> done and eventually end the process if there are no other references
to it.
>
> The 'official' way, according to MSDN, seems to be the
CoLockObjectExternal
> function [1]; in comtypes it is not exposed but you can define a
method in
> your COMObject based class like this:
>
> def CoLockObjectExternal(self, fLock, fLastUnlockReleases):
> punk = self._com_pointers_.values()[0]
> windll.oledll.ole32.CoLockObjectExternal(punk,
> fLock,
> fLastUnlockReleases)
>
> I'm not really sure about the differences in the two approaches.
>
> Thomas
>
>
> [1]
> http://msdn.microsoft.com/en-
> us/library/windows/desktop/ms680592%28v=vs.85%29.aspx
>
>
------------------------------------------------------------------------
------
> For Developers, A Lot Can Happen In A Second.
> Boundary is the first to Know...and Tell You.
> Monitor Your Applications in Ultra-Fine Resolution. Try it FREE!
> http://p.sf.net/sfu/Boundary-d2dvs2
> _______________________________________________
> comtypes-users mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/comtypes-users
------------------------------------------------------------------------------
For Developers, A Lot Can Happen In A Second.
Boundary is the first to Know...and Tell You.
Monitor Your Applications in Ultra-Fine Resolution. Try it FREE!
http://p.sf.net/sfu/Boundary-d2dvs2
_______________________________________________
comtypes-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/comtypes-users