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.
213 lines
6.9 KiB
213 lines
6.9 KiB
6 years ago
|
"""This module defines the following interfaces:
|
||
|
|
||
|
IErrorLog
|
||
|
IPropertyBag
|
||
|
IPersistPropertyBag
|
||
|
IPropertyBag2
|
||
|
IPersistPropertyBag2
|
||
|
|
||
|
The 'DictPropertyBag' class is a class implementing the IPropertyBag
|
||
|
interface, useful in client code.
|
||
|
"""
|
||
|
from ctypes import *
|
||
|
from ctypes.wintypes import WORD, DWORD, BOOL
|
||
|
from comtypes import GUID, IUnknown, COMMETHOD, HRESULT, dispid
|
||
|
from comtypes import IPersist
|
||
|
from comtypes.automation import VARIANT, tagEXCEPINFO
|
||
|
|
||
|
# XXX Replace by canonical solution!!!
|
||
|
WSTRING = c_wchar_p
|
||
|
|
||
|
class IErrorLog(IUnknown):
|
||
|
_iid_ = GUID('{3127CA40-446E-11CE-8135-00AA004BB851}')
|
||
|
_idlflags_ = []
|
||
|
_methods_ = [
|
||
|
COMMETHOD([], HRESULT, 'AddError',
|
||
|
( ['in'], WSTRING, 'pszPropName' ),
|
||
|
( ['in'], POINTER(tagEXCEPINFO), 'pExcepInfo' )),
|
||
|
]
|
||
|
|
||
|
class IPropertyBag(IUnknown):
|
||
|
_iid_ = GUID('{55272A00-42CB-11CE-8135-00AA004BB851}')
|
||
|
_idlflags_ = []
|
||
|
_methods_ = [
|
||
|
# XXX Note: According to MSDN, pVar and pErrorLog are ['in', 'out'] parameters.
|
||
|
#
|
||
|
# XXX ctypes does NOT yet accept POINTER(IErrorLog) as 'out' parameter:
|
||
|
# TypeError: 'out' parameter 3 must be a pointer type, not POINTER(IErrorLog)
|
||
|
COMMETHOD([], HRESULT, 'Read',
|
||
|
( ['in'], WSTRING, 'pszPropName' ),
|
||
|
( ['in', 'out'], POINTER(VARIANT), 'pVar' ),
|
||
|
( ['in'], POINTER(IErrorLog), 'pErrorLog' )),
|
||
|
## ( ['in', 'out'], POINTER(IErrorLog), 'pErrorLog' )),
|
||
|
COMMETHOD([], HRESULT, 'Write',
|
||
|
( ['in'], WSTRING, 'pszPropName' ),
|
||
|
( ['in'], POINTER(VARIANT), 'pVar' )),
|
||
|
]
|
||
|
|
||
|
class IPersistPropertyBag(IPersist):
|
||
|
_iid_ = GUID('{37D84F60-42CB-11CE-8135-00AA004BB851}')
|
||
|
_idlflags_ = []
|
||
|
_methods_ = [
|
||
|
COMMETHOD([], HRESULT, 'InitNew'),
|
||
|
COMMETHOD([], HRESULT, 'Load',
|
||
|
( ['in'], POINTER(IPropertyBag), 'pPropBag' ),
|
||
|
( ['in'], POINTER(IErrorLog), 'pErrorLog' )),
|
||
|
COMMETHOD([], HRESULT, 'Save',
|
||
|
( ['in'], POINTER(IPropertyBag), 'pPropBag' ),
|
||
|
( ['in'], c_int, 'fClearDirty' ),
|
||
|
( ['in'], c_int, 'fSaveAllProperties' )),
|
||
|
]
|
||
|
|
||
|
|
||
|
CLIPFORMAT = WORD
|
||
|
|
||
|
PROPBAG2_TYPE_UNDEFINED = 0
|
||
|
PROPBAG2_TYPE_DATA = 1
|
||
|
PROPBAG2_TYPE_URL = 2
|
||
|
PROPBAG2_TYPE_OBJECT = 3
|
||
|
PROPBAG2_TYPE_STREAM = 4
|
||
|
PROPBAG2_TYPE_STORAGE = 5
|
||
|
PROPBAG2_TYPE_MONIKER = 6
|
||
|
|
||
|
class tagPROPBAG2(Structure):
|
||
|
_fields_ = [
|
||
|
('dwType', c_ulong),
|
||
|
('vt', c_ushort),
|
||
|
('cfType', CLIPFORMAT),
|
||
|
('dwHint', c_ulong),
|
||
|
('pstrName', WSTRING),
|
||
|
('clsid', GUID),
|
||
|
]
|
||
|
|
||
|
class IPropertyBag2(IUnknown):
|
||
|
_iid_ = GUID('{22F55882-280B-11D0-A8A9-00A0C90C2004}')
|
||
|
_idlflags_ = []
|
||
|
_methods_ = [
|
||
|
COMMETHOD([], HRESULT, 'Read',
|
||
|
( ['in'], c_ulong, 'cProperties' ),
|
||
|
( ['in'], POINTER(tagPROPBAG2), 'pPropBag' ),
|
||
|
( ['in'], POINTER(IErrorLog), 'pErrLog' ),
|
||
|
( ['out'], POINTER(VARIANT), 'pvarValue' ),
|
||
|
( ['out'], POINTER(HRESULT), 'phrError' )),
|
||
|
COMMETHOD([], HRESULT, 'Write',
|
||
|
( ['in'], c_ulong, 'cProperties' ),
|
||
|
( ['in'], POINTER(tagPROPBAG2), 'pPropBag' ),
|
||
|
( ['in'], POINTER(VARIANT), 'pvarValue' )),
|
||
|
COMMETHOD([], HRESULT, 'CountProperties',
|
||
|
( ['out'], POINTER(c_ulong), 'pcProperties' )),
|
||
|
COMMETHOD([], HRESULT, 'GetPropertyInfo',
|
||
|
( ['in'], c_ulong, 'iProperty' ),
|
||
|
( ['in'], c_ulong, 'cProperties' ),
|
||
|
( ['out'], POINTER(tagPROPBAG2), 'pPropBag' ),
|
||
|
( ['out'], POINTER(c_ulong), 'pcProperties' )),
|
||
|
COMMETHOD([], HRESULT, 'LoadObject',
|
||
|
( ['in'], WSTRING, 'pstrName' ),
|
||
|
( ['in'], c_ulong, 'dwHint' ),
|
||
|
( ['in'], POINTER(IUnknown), 'punkObject' ),
|
||
|
( ['in'], POINTER(IErrorLog), 'pErrLog' )),
|
||
|
]
|
||
|
|
||
|
class IPersistPropertyBag2(IPersist):
|
||
|
_iid_ = GUID('{22F55881-280B-11D0-A8A9-00A0C90C2004}')
|
||
|
_idlflags_ = []
|
||
|
_methods_ = [
|
||
|
COMMETHOD([], HRESULT, 'InitNew'),
|
||
|
COMMETHOD([], HRESULT, 'Load',
|
||
|
( ['in'], POINTER(IPropertyBag2), 'pPropBag' ),
|
||
|
( ['in'], POINTER(IErrorLog), 'pErrLog' )),
|
||
|
COMMETHOD([], HRESULT, 'Save',
|
||
|
( ['in'], POINTER(IPropertyBag2), 'pPropBag' ),
|
||
|
( ['in'], c_int, 'fClearDirty' ),
|
||
|
( ['in'], c_int, 'fSaveAllProperties' )),
|
||
|
COMMETHOD([], HRESULT, 'IsDirty'),
|
||
|
]
|
||
|
|
||
|
|
||
|
# STGM constants
|
||
|
# Access
|
||
|
STGM_READ = 0x00000000
|
||
|
STGM_WRITE = 0x00000001
|
||
|
STGM_READWRITE = 0x00000002
|
||
|
|
||
|
# Sharing
|
||
|
STGM_SHARE_EXCLUSIVE = 0x00000010
|
||
|
STGM_SHARE_DENY_WRITE = 0x00000020
|
||
|
STGM_SHARE_DENY_READ = 0x00000030
|
||
|
STGM_SHARE_DENY_NONE = 0x00000040
|
||
|
STGM_PRIORITY = 0x00040000
|
||
|
|
||
|
# Creation
|
||
|
STGM_FAILIFTHERE = 0x00000000
|
||
|
STGM_CREATE = 0x00001000
|
||
|
STGM_CONVERT = 0x00020000
|
||
|
|
||
|
# Transactioning
|
||
|
STGM_DIRECT = 0x00000000
|
||
|
STGM_TRANSACTED = 0x00010000
|
||
|
|
||
|
# Transactioning Performance
|
||
|
STGM_NOSCRATCH = 0x00100000
|
||
|
STGM_NOSNAPSHOT = 0x00200000
|
||
|
|
||
|
# Direct SWMR and Simple
|
||
|
STGM_SIMPLE = 0x08000000
|
||
|
STGM_DIRECT_SWMR = 0x00400000
|
||
|
|
||
|
# Delete on release
|
||
|
STGM_DELETEONRELEASE = 0x04000000
|
||
|
|
||
|
LPOLESTR = LPCOLESTR = c_wchar_p
|
||
|
|
||
|
class IPersistFile(IPersist):
|
||
|
_iid_ = GUID('{0000010B-0000-0000-C000-000000000046}')
|
||
|
_idlflags_ = []
|
||
|
_methods_ = [
|
||
|
COMMETHOD([], HRESULT, 'IsDirty'),
|
||
|
COMMETHOD([], HRESULT, 'Load',
|
||
|
( ['in'], LPCOLESTR, 'pszFileName' ),
|
||
|
( ['in'], DWORD, 'dwMode' )),
|
||
|
COMMETHOD([], HRESULT, 'Save',
|
||
|
( ['in'], LPCOLESTR, 'pszFileName' ),
|
||
|
( ['in'], BOOL, 'fRemember' )),
|
||
|
COMMETHOD([], HRESULT, 'SaveCompleted',
|
||
|
( ['in'], LPCOLESTR, 'pszFileName' )),
|
||
|
COMMETHOD([], HRESULT, 'GetCurFile',
|
||
|
( ['out'], POINTER(LPOLESTR), 'ppszFileName' ))
|
||
|
]
|
||
|
|
||
|
|
||
|
from comtypes import COMObject
|
||
|
from comtypes.hresult import *
|
||
|
class DictPropertyBag(COMObject):
|
||
|
"""An object implementing the IProperty interface on a dictionary.
|
||
|
|
||
|
Pass named values in the constructor for the client to Read(), or
|
||
|
retrieve from the .values instance variable after the client has
|
||
|
called Load().
|
||
|
"""
|
||
|
_com_interfaces_ = [IPropertyBag]
|
||
|
|
||
|
def __init__(self, **kw):
|
||
|
super(DictPropertyBag, self).__init__()
|
||
|
self.values = kw
|
||
|
|
||
|
def Read(self, this, name, pVar, errorlog):
|
||
|
try:
|
||
|
val = self.values[name]
|
||
|
except KeyError:
|
||
|
return E_INVALIDARG
|
||
|
# The caller did provide info about the type that is expected
|
||
|
# with the pVar[0].vt typecode, except when this is VT_EMPTY.
|
||
|
var = pVar[0]
|
||
|
typecode = var.vt
|
||
|
var.value = val
|
||
|
if typecode:
|
||
|
var.ChangeType(typecode)
|
||
|
return S_OK
|
||
|
|
||
|
def Write(self, this, name, var):
|
||
|
val = var[0].value
|
||
|
self.values[name] = val
|
||
|
return S_OK
|