def __init__(self, patterns=None, encoding='utf8', **options): # Make sure encoding is taken care of when passing strings self.encoding = encoding ctypes.set_conversion_mode(encoding, 'replace') if 'nthread' not in options: # If thread count isn't given, use number of processors options['nthread'] = multiprocessing.cpu_count() # Add unspecified options values from Wapiti's default struct for field in _default_options._fields_: field_name = field[0] if not field_name in options: options[field_name] = getattr(_default_options, field_name) if options['maxiter'] == 0: # Wapiti specifies that 0 means max int size for this option. options['maxiter'] = 2147483647 self.options = OptType(**options) # Load model from file if specified if self.options.model: self._model = _wapiti.api_load_model(self.options.model, ctypes.pointer(self.options)) else: if self.options.pattern: self.patterns = open(self.options.pattern).read() else: self.patterns = patterns self._model = _wapiti.api_new_model(ctypes.pointer(self.options), self.patterns)
def test_latin1_strict(self): wcslen = self.wcslen ctypes.set_conversion_mode("latin-1", "strict") self.assertEqual(wcslen(u"abc"), 3) self.assertEqual(wcslen(u"ab\u2070"), 3) self.assertEqual(wcslen("abc"), 3) self.assertEqual(wcslen("הצ��"), 4)
def test_ascii_ignore(self): ctypes.set_conversion_mode("ascii", "ignore") self.failUnlessEqual(wcslen(u"abc"), 3) self.failUnlessEqual(wcslen(u"ab\u2070"), 3) # ignore error mode skips non-ascii characters self.failUnlessEqual(wcslen("abc"), 3) self.failUnlessEqual(wcslen("הצ��"), 0)
def test_ascii_replace(self): wcslen = self.wcslen ctypes.set_conversion_mode("ascii", "replace") self.assertEqual(wcslen(u"abc"), 3) self.assertEqual(wcslen(u"ab\u2070"), 3) self.assertEqual(wcslen("abc"), 3) self.assertEqual(wcslen("abה"), 3)
def test_ascii_replace(self): wcslen = self.wcslen ctypes.set_conversion_mode("ascii", "replace") self.assertEqual(wcslen(u"abc"), 3) self.assertEqual(wcslen(u"ab\u2070"), 3) self.assertEqual(wcslen("abc"), 3) self.assertEqual(wcslen("abä"), 3)
def test_ascii_ignore(self): ctypes.set_conversion_mode("ascii", "ignore") self.failUnlessEqual(wcslen("abc"), 3) self.failUnlessEqual(wcslen("ab\u2070"), 3) # ignore error mode skips non-ascii characters self.failUnlessEqual(wcslen("abc"), 3) self.failUnlessEqual(wcslen(b"\xe4\xf6\xfc\xdf"), 0)
def test_latin1_strict(self): wcslen = self.wcslen ctypes.set_conversion_mode("latin-1", "strict") self.assertEqual(wcslen(u"abc"), 3) self.assertEqual(wcslen(u"ab\u2070"), 3) self.assertEqual(wcslen("abc"), 3) self.assertEqual(wcslen("äöüß"), 4)
def test_ascii_ignore(self): ctypes.set_conversion_mode("ascii", "ignore") assert wcslen(u"abc") == 3 assert wcslen(u"ab\u2070") == 3 # ignore error mode skips non-ascii characters assert wcslen("abc") == 3 assert wcslen("הצ��") == 0
def test_ascii_ignore(self): ctypes.set_conversion_mode("ascii", "ignore") self.assertEqual(wcslen(u"abc"), 3) self.assertEqual(wcslen(u"ab\u2070"), 3) # ignore error mode skips non-ascii characters self.assertEqual(wcslen("abc"), 3) self.assertEqual(wcslen("g"), 0)
def test_ascii_strict(self): ctypes.set_conversion_mode("ascii", "strict") # no conversions take place with unicode arguments self.failUnlessEqual(wcslen("abc"), 3) self.failUnlessEqual(wcslen("ab\u2070"), 3) # string args are converted self.failUnlessEqual(wcslen("abc"), 3) self.failUnlessRaises(ctypes.ArgumentError, wcslen, b"ab\xe4")
def test_ascii_strict(self): ctypes.set_conversion_mode("ascii", "strict") # no conversions take place with unicode arguments assert wcslen(u"abc") == 3 assert wcslen(u"ab\u2070") == 3 # string args are converted assert wcslen("abc") == 3 py.test.raises(ctypes.ArgumentError, wcslen, "abה")
def test_ascii_strict(self): ctypes.set_conversion_mode("ascii", "strict") # no conversions take place with unicode arguments self.failUnlessEqual(wcslen(u"abc"), 3) self.failUnlessEqual(wcslen(u"ab\u2070"), 3) # string args are converted self.failUnlessEqual(wcslen("abc"), 3) self.failUnlessRaises(ctypes.ArgumentError, wcslen, "abה")
def test_ascii_strict(self): wcslen = self.wcslen ctypes.set_conversion_mode("ascii", "strict") # no conversions take place with unicode arguments self.assertEqual(wcslen(u"abc"), 3) self.assertEqual(wcslen(u"ab\u2070"), 3) # string args are converted self.assertEqual(wcslen("abc"), 3) self.assertRaises(ctypes.ArgumentError, wcslen, "abä")
def __init__(self, patterns=None, encoding='utf8', **options): # Make sure encoding is taken care of when passing strings self.encoding = encoding ctypes.set_conversion_mode(encoding, 'replace') if 'nthread' not in options: # If thread count isn't given, use number of processors options['nthread'] = multiprocessing.cpu_count() # Add unspecified options values from Wapiti's default struct for field in _default_options._fields_: field_name = field[0] if not field_name in options: options[field_name] = getattr(_default_options, field_name) if options['maxiter'] == 0: # Wapiti specifies that 0 means max int size for this option. options['maxiter'] = 2147483647 self.options = OptType(**options) # Load model from file if specified if self.options.model: self._model = _wapiti.api_load_model( self.options.model, ctypes.pointer(self.options) ) else: if self.options.pattern: self.patterns = open(self.options.pattern).read() else: self.patterns = patterns self._model = _wapiti.api_new_model( ctypes.pointer(self.options), self.patterns )
def test_buffers(self): ctypes.set_conversion_mode("ascii", "strict") buf = ctypes.create_unicode_buffer("abc") assert len(buf) == 3 + 1 ctypes.set_conversion_mode("ascii", "replace") buf = ctypes.create_unicode_buffer("abהצ�") assert buf[:] == u"ab\uFFFD\uFFFD\uFFFD\0" ctypes.set_conversion_mode("ascii", "ignore") buf = ctypes.create_unicode_buffer("abהצ�") # is that correct? not sure. But with 'ignore', you get what you pay for.. assert buf[:] == u"ab\0\0\0\0"
def test_buffers(self): ctypes.set_conversion_mode("ascii", "strict") buf = ctypes.create_unicode_buffer("abc") self.failUnlessEqual(len(buf), 3 + 1) ctypes.set_conversion_mode("ascii", "replace") buf = ctypes.create_unicode_buffer("abהצ�") self.failUnlessEqual(buf[:], u"ab\uFFFD\uFFFD\uFFFD\0") ctypes.set_conversion_mode("ascii", "ignore") buf = ctypes.create_unicode_buffer("abהצ�") # is that correct? not sure. But with 'ignore', you get what you pay for.. self.failUnlessEqual(buf[:], u"ab\0\0\0\0")
def test_buffers(self): ctypes.set_conversion_mode("ascii", "strict") buf = ctypes.create_string_buffer(u"abc") self.failUnlessEqual(len(buf), 3 + 1) ctypes.set_conversion_mode("ascii", "replace") buf = ctypes.create_string_buffer(u"abהצ�") self.failUnlessEqual(buf[:], "ab???\0") ctypes.set_conversion_mode("ascii", "ignore") buf = ctypes.create_string_buffer(u"abהצ�") # is that correct? not sure. But with 'ignore', you get what you pay for.. self.failUnlessEqual(buf[:], "ab\0\0\0\0")
def test_buffers(self): ctypes.set_conversion_mode("ascii", "strict") buf = ctypes.create_string_buffer(u"abc") assert len(buf) == 3+1 ctypes.set_conversion_mode("ascii", "replace") buf = ctypes.create_string_buffer(u"abהצ�") assert buf[:] == "ab???\0" ctypes.set_conversion_mode("ascii", "ignore") buf = ctypes.create_string_buffer(u"abהצ�") # is that correct? not sure. But with 'ignore', you get what you pay for.. assert buf[:] == "ab\0\0\0\0"
def test_buffers(self): ctypes.set_conversion_mode("ascii", "strict") buf = ctypes.create_string_buffer(u"abc") self.assertEqual(len(buf), 4) ctypes.set_conversion_mode("ascii", "replace") buf = ctypes.create_string_buffer(u"ab\xe4\xf6\xfc") self.assertEqual(buf[:], "ab???\x00") self.assertEqual(buf[::], "ab???\x00") self.assertEqual(buf[::-1], "\x00???ba") self.assertEqual(buf[::2], "a??") self.assertEqual(buf[6:5:-1], "") ctypes.set_conversion_mode("ascii", "ignore") buf = ctypes.create_string_buffer(u"ab\xe4\xf6\xfc") self.assertEqual(buf[:], "ab\x00\x00\x00\x00") self.assertEqual(buf[::], "ab\x00\x00\x00\x00") self.assertEqual(buf[::-1], "\x00\x00\x00\x00ba") return
def test_buffers(self): ctypes.set_conversion_mode('ascii', 'strict') buf = ctypes.create_string_buffer(u'abc') self.assertEqual(len(buf), 4) ctypes.set_conversion_mode('ascii', 'replace') buf = ctypes.create_string_buffer(u'ab\xe4\xf6\xfc') self.assertEqual(buf[:], 'ab???\x00') self.assertEqual(buf[::], 'ab???\x00') self.assertEqual(buf[::-1], '\x00???ba') self.assertEqual(buf[::2], 'a??') self.assertEqual(buf[6:5:-1], '') ctypes.set_conversion_mode('ascii', 'ignore') buf = ctypes.create_string_buffer(u'ab\xe4\xf6\xfc') self.assertEqual(buf[:], 'ab\x00\x00\x00\x00') self.assertEqual(buf[::], 'ab\x00\x00\x00\x00') self.assertEqual(buf[::-1], '\x00\x00\x00\x00ba') return
def test_buffers(self): ctypes.set_conversion_mode("ascii", "strict") buf = ctypes.create_unicode_buffer("abc") self.assertEqual(len(buf), 4) ctypes.set_conversion_mode("ascii", "replace") buf = ctypes.create_unicode_buffer("ab\xe4\xf6\xfc") self.assertEqual(buf[:], u"ab\ufffd\ufffd\ufffd\x00") self.assertEqual(buf[::], u"ab\ufffd\ufffd\ufffd\x00") self.assertEqual(buf[::-1], u"\x00\ufffd\ufffd\ufffdba") self.assertEqual(buf[::2], u"a\ufffd\ufffd") self.assertEqual(buf[6:5:-1], u"") ctypes.set_conversion_mode("ascii", "ignore") buf = ctypes.create_unicode_buffer("ab\xe4\xf6\xfc") self.assertEqual(buf[:], u"ab\x00\x00\x00\x00") self.assertEqual(buf[::], u"ab\x00\x00\x00\x00") self.assertEqual(buf[::-1], u"\x00\x00\x00\x00ba") self.assertEqual(buf[::2], u"a\x00\x00") self.assertEqual(buf[6:5:-1], u"") return
def test_buffers(self): ctypes.set_conversion_mode("ascii", "strict") buf = ctypes.create_string_buffer(u"abc") self.assertEqual(len(buf), 3+1) ctypes.set_conversion_mode("ascii", "replace") buf = ctypes.create_string_buffer(u"abg") self.assertEqual(buf[:], "ab???\0") self.assertEqual(buf[::], "ab???\0") self.assertEqual(buf[::-1], "\0???ba") self.assertEqual(buf[::2], "a??") self.assertEqual(buf[6:5:-1], "") ctypes.set_conversion_mode("ascii", "ignore") buf = ctypes.create_string_buffer(u"abg") # is that correct? not sure. But with 'ignore', you get what you pay for.. self.assertEqual(buf[:], "ab\0\0\0\0") self.assertEqual(buf[::], "ab\0\0\0\0") self.assertEqual(buf[::-1], "\0\0\0\0ba")
def test_buffers(self): ctypes.set_conversion_mode('ascii', 'strict') buf = ctypes.create_unicode_buffer('abc') self.assertEqual(len(buf), 4) ctypes.set_conversion_mode('ascii', 'replace') buf = ctypes.create_unicode_buffer('ab\xe4\xf6\xfc') self.assertEqual(buf[:], u'ab\ufffd\ufffd\ufffd\x00') self.assertEqual(buf[::], u'ab\ufffd\ufffd\ufffd\x00') self.assertEqual(buf[::-1], u'\x00\ufffd\ufffd\ufffdba') self.assertEqual(buf[::2], u'a\ufffd\ufffd') self.assertEqual(buf[6:5:-1], u'') ctypes.set_conversion_mode('ascii', 'ignore') buf = ctypes.create_unicode_buffer('ab\xe4\xf6\xfc') self.assertEqual(buf[:], u'ab\x00\x00\x00\x00') self.assertEqual(buf[::], u'ab\x00\x00\x00\x00') self.assertEqual(buf[::-1], u'\x00\x00\x00\x00ba') self.assertEqual(buf[::2], u'a\x00\x00') self.assertEqual(buf[6:5:-1], u'') return
def test_buffers(self): ctypes.set_conversion_mode("ascii", "strict") buf = ctypes.create_string_buffer("abc") self.failUnlessEqual(len(buf), 3+1) ctypes.set_conversion_mode("ascii", "replace") buf = ctypes.create_string_buffer("ab\xe4\xf6\xfc") self.failUnlessEqual(buf[:], b"ab???\0") self.failUnlessEqual(buf[::], b"ab???\0") self.failUnlessEqual(buf[::-1], b"\0???ba") self.failUnlessEqual(buf[::2], b"a??") self.failUnlessEqual(buf[6:5:-1], b"") ctypes.set_conversion_mode("ascii", "ignore") buf = ctypes.create_string_buffer("ab\xe4\xf6\xfc") # is that correct? not sure. But with 'ignore', you get what you pay for.. self.failUnlessEqual(buf[:], b"ab\0\0\0\0") self.failUnlessEqual(buf[::], b"ab\0\0\0\0") self.failUnlessEqual(buf[::-1], b"\0\0\0\0ba")
def test_buffers(self): ctypes.set_conversion_mode("ascii", "strict") buf = ctypes.create_unicode_buffer("abc") self.failUnlessEqual(len(buf), 3 + 1) ctypes.set_conversion_mode("ascii", "replace") buf = ctypes.create_unicode_buffer(b"ab\xe4\xf6\xfc") self.failUnlessEqual(buf[:], "ab\uFFFD\uFFFD\uFFFD\0") self.failUnlessEqual(buf[::], "ab\uFFFD\uFFFD\uFFFD\0") self.failUnlessEqual(buf[::-1], "\0\uFFFD\uFFFD\uFFFDba") self.failUnlessEqual(buf[::2], "a\uFFFD\uFFFD") self.failUnlessEqual(buf[6:5:-1], "") ctypes.set_conversion_mode("ascii", "ignore") buf = ctypes.create_unicode_buffer(b"ab\xe4\xf6\xfc") # is that correct? not sure. But with 'ignore', you get what you pay for.. self.failUnlessEqual(buf[:], "ab\0\0\0\0") self.failUnlessEqual(buf[::], "ab\0\0\0\0") self.failUnlessEqual(buf[::-1], "\0\0\0\0ba") self.failUnlessEqual(buf[::2], "a\0\0") self.failUnlessEqual(buf[6:5:-1], "")
def test_buffers(self): ctypes.set_conversion_mode("ascii", "strict") buf = ctypes.create_unicode_buffer("abc") self.assertEqual(len(buf), 3+1) ctypes.set_conversion_mode("ascii", "replace") buf = ctypes.create_unicode_buffer("abg") self.assertEqual(buf[:], u"ab\uFFFD\uFFFD\uFFFD\0") self.assertEqual(buf[::], u"ab\uFFFD\uFFFD\uFFFD\0") self.assertEqual(buf[::-1], u"\0\uFFFD\uFFFD\uFFFDba") self.assertEqual(buf[::2], u"a\uFFFD\uFFFD") self.assertEqual(buf[6:5:-1], u"") ctypes.set_conversion_mode("ascii", "ignore") buf = ctypes.create_unicode_buffer("abg") # is that correct? not sure. But with 'ignore', you get what you pay for.. self.assertEqual(buf[:], u"ab\0\0\0\0") self.assertEqual(buf[::], u"ab\0\0\0\0") self.assertEqual(buf[::-1], u"\0\0\0\0ba") self.assertEqual(buf[::2], u"a\0\0") self.assertEqual(buf[6:5:-1], u"")
def test_ascii_replace(self): ctypes.set_conversion_mode('ascii', 'replace') self.assertEqual(func('abc'), 'abc') self.assertEqual(func(u'abc'), 'abc') self.assertEqual(func(u'\xe4\xf6\xfc\xdf'), '????')
def test_ascii_replace(self): ctypes.set_conversion_mode('ascii', 'strict') self.assertEqual(func('abc'), 'abc') self.assertEqual(func(u'abc'), 'abc') self.assertRaises(ctypes.ArgumentError, func, u'ab\xe4')
def test_ascii_ignore(self): ctypes.set_conversion_mode('ascii', 'ignore') self.assertEqual(func('abc'), 'abc') self.assertEqual(func(u'abc'), 'abc') self.assertEqual(func(u'\xe4\xf6\xfc\xdf'), '')
def test_latin1_strict(self): ctypes.set_conversion_mode("latin-1", "strict") self.failUnlessEqual(wcslen(u"abc"), 3) self.failUnlessEqual(wcslen(u"ab\u2070"), 3) self.failUnlessEqual(wcslen("abc"), 3) self.failUnlessEqual(wcslen("הצ��"), 4)
def test_ascii_replace(self): ctypes.set_conversion_mode("ascii", "strict") self.failUnlessEqual(func("abc"), "abc") self.failUnlessEqual(func("abc"), "abc") self.assertRaises(ctypes.ArgumentError, func, "ab\xe4")
def tearDown(self): ctypes.set_conversion_mode(*self.prev_conv_mode)
def test_ascii_replace(self): ctypes.set_conversion_mode("ascii", "replace") self.failUnlessEqual(wcslen(u"abc"), 3) self.failUnlessEqual(wcslen(u"ab\u2070"), 3) self.failUnlessEqual(wcslen("abc"), 3) self.failUnlessEqual(wcslen("abה"), 3)
def test_ascii_replace_2(self): ctypes.set_conversion_mode("ascii", "replace") assert func("abc") == "abc" assert func(u"abc") == "abc" assert func(u"הצ��") == "????"
def test_ascii_replace(self): ctypes.set_conversion_mode("ascii", "replace") self.failUnlessEqual(wcslen("abc"), 3) self.failUnlessEqual(wcslen("ab\u2070"), 3) self.failUnlessEqual(wcslen("abc"), 3) self.failUnlessEqual(wcslen("ab\xe4"), 3)
def setUp(self): self.prev_conv_mode = ctypes.set_conversion_mode("ascii", "strict") func.argtypes = [ctypes.c_char_p] func.restype = ctypes.c_char_p
def test_ascii_ignore(self): ctypes.set_conversion_mode("ascii", "ignore") self.assertEqual(func("abc"), "abc") self.assertEqual(func(u"abc"), "abc") self.assertEqual(func(u"g"), "")
def test_ascii_replace(self): ctypes.set_conversion_mode("ascii", "strict") self.failUnlessEqual(func("abc"), "abc") self.failUnlessEqual(func(u"abc"), "abc") self.assertRaises(ctypes.ArgumentError, func, u"abה")
WINFUNCTYPE.__doc__ = ctypes.CFUNCTYPE.__doc__.replace( "CFUNCTYPE", "WINFUNCTYPE") ctypes.WINFUNCTYPE = WINFUNCTYPE # Fix _reset_cache. _original_reset_cache = ctypes._reset_cache def _reset_cache(): ctypes._win_functype_cache.clear() _original_reset_cache() ctypes._reset_cache = _reset_cache # Fix the string conversion mode. if hasattr(ctypes, "set_conversion_mode"): ctypes.set_conversion_mode("mbcs", "ignore") # Fix WinDLL. class WinDLL(ctypes.CDLL): """This class represents a dll exporting functions using the Windows stdcall calling convention. """ _func_flags_ = _FUNCFLAG_STDCALL ctypes.WinDLL = WinDLL # Fix HRESULT. from _ctypes import _SimpleCData class HRESULT(_SimpleCData): _type_ = "l"
def test_ascii_ignore(self): ctypes.set_conversion_mode("ascii", "ignore") self.failUnlessEqual(func("abc"), "abc") self.failUnlessEqual(func("abc"), "abc") self.failUnlessEqual(func("\xe4\xf6\xfc\xdf"), "")
import ctypes import datetime import itertools import os from pyaloha.protocol import SerializableDatetime ctypes.set_conversion_mode('utf8', 'strict') def c_unicode(c_data): return unicode(ctypes.string_at(c_data), 'utf8') def c_string(c_data): return c_data class CEVENTTIME(ctypes.Structure): _fields_ = [('client_creation', ctypes.c_uint64), ('server_upload', ctypes.c_uint64)] __slots__ = ('client_creation', 'server_upload', 'dtime', 'is_accurate') delta_past = datetime.timedelta(days=6 * 30) delta_future = datetime.timedelta(days=1) def _setup_time(self): client_dtime = SerializableDatetime.utcfromtimestamp( self.client_creation / 1000. # timestamp is in millisecs )
def setUp(self): self.prev_conv_mode = ctypes.set_conversion_mode("ascii", "strict")
def test_ascii_ignore(self): ctypes.set_conversion_mode('ascii', 'ignore') self.assertEqual(wcslen(u'abc'), 3) self.assertEqual(wcslen(u'ab\u2070'), 3) self.assertEqual(wcslen('abc'), 3) self.assertEqual(wcslen('\xe4\xf6\xfc\xdf'), 0)
def test_ascii_replace(self): ctypes.set_conversion_mode("ascii", "replace") self.failUnlessEqual(func("abc"), "abc") self.failUnlessEqual(func("abc"), "abc") self.failUnlessEqual(func("\xe4\xf6\xfc\xdf"), "????")
def test_latin1_strict(self): ctypes.set_conversion_mode('latin-1', 'strict') self.assertEqual(wcslen(u'abc'), 3) self.assertEqual(wcslen(u'ab\u2070'), 3) self.assertEqual(wcslen('abc'), 3) self.assertEqual(wcslen('\xe4\xf6\xfc\xdf'), 4)
import ctypes import datetime import itertools import os import sys from pyaloha.protocol import SerializableDatetime try: from ctypes import set_conversion_mode except ImportError: pass else: set_conversion_mode('utf8', 'strict') def c_unicode(c_data): return unicode(ctypes.string_at(c_data), 'utf8') def c_string(c_data): return c_data class CEVENTTIME(ctypes.Structure): _fields_ = [('client_creation', ctypes.c_uint64), ('server_upload', ctypes.c_uint64)] __slots__ = ('client_creation', 'server_upload', 'dtime', 'is_accurate') delta_past = datetime.timedelta(days=6 * 30)
def test_ascii_replace(self): ctypes.set_conversion_mode("ascii", "replace") self.assertEqual(func("abc"), "abc") self.assertEqual(func(u"abc"), "abc") self.assertEqual(func(u"g"), "????")
def test_ascii_replace(self): ctypes.set_conversion_mode("ascii", "replace") self.failUnlessEqual(func("abc"), "abc") self.failUnlessEqual(func(u"abc"), "abc") self.failUnlessEqual(func(u"הצ��"), "????")
def tearDown(self): ctypes.set_conversion_mode(*self.prev_conv_mode) func.argtypes = None func.restype = ctypes.c_int
def test_latin1_strict(self): ctypes.set_conversion_mode("latin-1", "strict") self.failUnlessEqual(wcslen("abc"), 3) self.failUnlessEqual(wcslen("ab\u2070"), 3) self.failUnlessEqual(wcslen("abc"), 3) self.failUnlessEqual(wcslen("\xe4\xf6\xfc\xdf"), 4)
def test_ascii_ignore(self): ctypes.set_conversion_mode("ascii", "ignore") self.failUnlessEqual(func("abc"), "abc") self.failUnlessEqual(func(u"abc"), "abc") self.failUnlessEqual(func(u"הצ��"), "")
return WinFunctionType if WINFUNCTYPE.__doc__: WINFUNCTYPE.__doc__ = ctypes.CFUNCTYPE.__doc__.replace( "CFUNCTYPE", "WINFUNCTYPE") ctypes.WINFUNCTYPE = WINFUNCTYPE # Fix _reset_cache. _original_reset_cache = ctypes._reset_cache def _reset_cache(): ctypes._win_functype_cache.clear() _original_reset_cache() ctypes._reset_cache = _reset_cache # Fix the string conversion mode. if hasattr(ctypes, "set_conversion_mode"): ctypes.set_conversion_mode("mbcs", "ignore") # Fix WinDLL. class WinDLL(ctypes.CDLL): """This class represents a dll exporting functions using the Windows stdcall calling convention. """ _func_flags_ = _FUNCFLAG_STDCALL ctypes.WinDLL = WinDLL # Fix HRESULT. from _ctypes import _SimpleCData class HRESULT(_SimpleCData): _type_ = "l" ##_check_retval_ = _check_HRESULT ctypes.HRESULT = HRESULT