You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
104 lines
3.6 KiB
104 lines
3.6 KiB
import sys, os
|
|
import logging
|
|
logging.basicConfig()
|
|
##logging.basicConfig(level=logging.DEBUG)
|
|
##logger = logging.getLogger(__name__)
|
|
|
|
# Add comtypes to sys.path (if this is run from a SVN checkout)
|
|
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), r"..\..")))
|
|
|
|
import comtypes
|
|
from comtypes.hresult import S_OK
|
|
import comtypes.server.connectionpoints
|
|
|
|
################################################################
|
|
|
|
# Create the wrapper in the comtypes.gen package, it will be named
|
|
# TestComServerLib; the name is derived from the 'library ' statement
|
|
# in the IDL file
|
|
if not hasattr(sys, "frozen"):
|
|
import comtypes.client
|
|
# pathname of the type library file
|
|
tlbfile = os.path.join(os.path.dirname(__file__), "TestDispServer.tlb")
|
|
# if running as frozen app (dll or exe), the wrapper should be in
|
|
# the library archive, so we don't need to generate it.
|
|
comtypes.client.GetModule(tlbfile)
|
|
|
|
# Import the wrapper
|
|
from comtypes.gen import TestDispServerLib
|
|
|
|
################################################################
|
|
|
|
# Implement the CoClass by defining a subclass of the
|
|
# TestDispServerLib.TestDispServer class in the wrapper file. The
|
|
# COMObject base class provides default implementations of the
|
|
# IUnknown, IDispatch, IPersist, IProvideClassInfo,
|
|
# IProvideClassInfo2, and ISupportErrorInfo interfaces.
|
|
#
|
|
# The ConnectableObjectMixin class provides connectionpoints (events).
|
|
class TestDispServer(
|
|
TestDispServerLib.TestDispServer, # the coclass from the typelib wrapper
|
|
comtypes.server.connectionpoints.ConnectableObjectMixin,
|
|
):
|
|
|
|
# The default interface from the typelib MUST be the first
|
|
# interface, other interfaces can follow
|
|
|
|
_com_interfaces_ = TestDispServerLib.TestDispServer._com_interfaces_ + \
|
|
[comtypes.connectionpoints.IConnectionPointContainer]
|
|
|
|
# registry entries
|
|
_reg_threading_ = "Both"
|
|
_reg_progid_ = "TestDispServerLib.TestDispServer.1"
|
|
_reg_novers_progid_ = "TestDispServerLib.TestDispServer"
|
|
_reg_desc_ = "comtypes COM server sample for testing"
|
|
_reg_clsctx_ = comtypes.CLSCTX_INPROC_SERVER | comtypes.CLSCTX_LOCAL_SERVER
|
|
|
|
################################
|
|
# DTestDispServer methods
|
|
|
|
def DTestDispServer_eval(self, this, expr, presult):
|
|
self.Fire_Event(0, "EvalStarted", expr)
|
|
# The following two are equivalent, but the former is more generic:
|
|
presult[0] = eval(expr)
|
|
##presult[0].value = eval(expr)
|
|
self.Fire_Event(0, "EvalCompleted", expr, presult[0].value)
|
|
return S_OK
|
|
|
|
def DTestDispServer_eval2(self, expr):
|
|
self.Fire_Event(0, "EvalStarted", expr)
|
|
result = eval(expr)
|
|
self.Fire_Event(0, "EvalCompleted", expr, result)
|
|
return result
|
|
|
|
def DTestDispServer__get_id(self, this, pid):
|
|
pid[0] = id(self)
|
|
return S_OK
|
|
|
|
def DTestDispServer_Exec(self, this, what):
|
|
exec(what)
|
|
return S_OK
|
|
|
|
def DTestDispServer_Exec2(self, what):
|
|
exec(what)
|
|
|
|
_name = "spam, spam, spam"
|
|
|
|
# Implementation of the DTestDispServer::Name propget
|
|
def DTestDispServer__get_name(self, this, pname):
|
|
pname[0] = self._name
|
|
return S_OK
|
|
|
|
# Implementation of the DTestDispServer::Name propput
|
|
def DTestDispServer__set_name(self, this, name):
|
|
self._name = name
|
|
return S_OK
|
|
|
|
# Implementation of the DTestDispServer::SetName method
|
|
def DTestDispServer_sEtNaMe(self, name):
|
|
self._name = name
|
|
|
|
if __name__ == "__main__":
|
|
from comtypes.server.register import UseCommandLine
|
|
UseCommandLine(TestDispServer)
|