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.
102 lines
2.6 KiB
102 lines
2.6 KiB
6 years ago
|
from ctypes import *
|
||
|
import sys
|
||
|
|
||
|
if sys.version_info >= (2, 6):
|
||
|
def binary(obj):
|
||
|
return bytes(obj)
|
||
|
else:
|
||
|
def binary(obj):
|
||
|
return buffer(obj)
|
||
|
|
||
|
BYTE = c_byte
|
||
|
WORD = c_ushort
|
||
|
DWORD = c_ulong
|
||
|
|
||
|
_ole32 = oledll.ole32
|
||
|
|
||
|
_StringFromCLSID = _ole32.StringFromCLSID
|
||
|
_CoTaskMemFree = windll.ole32.CoTaskMemFree
|
||
|
_ProgIDFromCLSID = _ole32.ProgIDFromCLSID
|
||
|
_CLSIDFromString = _ole32.CLSIDFromString
|
||
|
_CLSIDFromProgID = _ole32.CLSIDFromProgID
|
||
|
_CoCreateGuid = _ole32.CoCreateGuid
|
||
|
|
||
|
# Note: Comparing GUID instances by comparing their buffers
|
||
|
# is slightly faster than using ole32.IsEqualGUID.
|
||
|
|
||
|
class GUID(Structure):
|
||
|
_fields_ = [("Data1", DWORD),
|
||
|
("Data2", WORD),
|
||
|
("Data3", WORD),
|
||
|
("Data4", BYTE * 8)]
|
||
|
|
||
|
def __init__(self, name=None):
|
||
|
if name is not None:
|
||
|
_CLSIDFromString(str(name), byref(self))
|
||
|
|
||
|
def __repr__(self):
|
||
|
return 'GUID("%s")' % str(self)
|
||
|
|
||
|
def __unicode__(self):
|
||
|
p = c_wchar_p()
|
||
|
_StringFromCLSID(byref(self), byref(p))
|
||
|
result = p.value
|
||
|
_CoTaskMemFree(p)
|
||
|
return result
|
||
|
__str__ = __unicode__
|
||
|
|
||
|
def __cmp__(self, other):
|
||
|
if isinstance(other, GUID):
|
||
|
return cmp(binary(self), binary(other))
|
||
|
return -1
|
||
|
|
||
|
def __bool__(self):
|
||
|
return self != GUID_null
|
||
|
|
||
|
def __eq__(self, other):
|
||
|
return isinstance(other, GUID) and \
|
||
|
binary(self) == binary(other)
|
||
|
|
||
|
def __hash__(self):
|
||
|
# We make GUID instances hashable, although they are mutable.
|
||
|
return hash(binary(self))
|
||
|
|
||
|
def copy(self):
|
||
|
return GUID(str(self))
|
||
|
|
||
|
def from_progid(cls, progid):
|
||
|
"""Get guid from progid, ...
|
||
|
"""
|
||
|
if hasattr(progid, "_reg_clsid_"):
|
||
|
progid = progid._reg_clsid_
|
||
|
if isinstance(progid, cls):
|
||
|
return progid
|
||
|
elif isinstance(progid, str):
|
||
|
if progid.startswith("{"):
|
||
|
return cls(progid)
|
||
|
inst = cls()
|
||
|
_CLSIDFromProgID(str(progid), byref(inst))
|
||
|
return inst
|
||
|
else:
|
||
|
raise TypeError("Cannot construct guid from %r" % progid)
|
||
|
from_progid = classmethod(from_progid)
|
||
|
|
||
|
def as_progid(self):
|
||
|
"Convert a GUID into a progid"
|
||
|
progid = c_wchar_p()
|
||
|
_ProgIDFromCLSID(byref(self), byref(progid))
|
||
|
result = progid.value
|
||
|
_CoTaskMemFree(progid)
|
||
|
return result
|
||
|
|
||
|
def create_new(cls):
|
||
|
"Create a brand new guid"
|
||
|
guid = cls()
|
||
|
_CoCreateGuid(byref(guid))
|
||
|
return guid
|
||
|
create_new = classmethod(create_new)
|
||
|
|
||
|
GUID_null = GUID()
|
||
|
|
||
|
__all__ = ["GUID"]
|