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.
49 lines
1.6 KiB
49 lines
1.6 KiB
import unittest, os
|
|
from copy import copy
|
|
from ctypes import *
|
|
from comtypes.client import GetModule, CreateObject
|
|
from comtypes.patcher import Patch
|
|
|
|
# ./urlhist.tlb was downloaded somewhere from the internet (?)
|
|
|
|
GetModule(os.path.join(os.path.dirname(__file__), "urlhist.tlb"))
|
|
from comtypes.gen import urlhistLib
|
|
|
|
# The pwcsTitle and pwcsUrl fields of the _STATURL structure must be
|
|
# freed by the caller. The only way to do this without patching the
|
|
# generated code directly is to monkey-patch the
|
|
# _STATURL.__ctypes_from_outparam__ method like this.
|
|
@Patch(urlhistlib._STATURL)
|
|
class _(object):
|
|
def __ctypes_from_outparam__(self):
|
|
from comtypes.util import cast_field
|
|
result = type(self)()
|
|
for n, _ in self._fields_:
|
|
setattr(result, n, getattr(self, n))
|
|
url, title = self.pwcsUrl, self.pwcsTitle
|
|
windll.ole32.CoTaskMemFree(cast_field(self, "pwcsUrl", c_void_p))
|
|
windll.ole32.CoTaskMemFree(cast_field(self, "pwcsTitle", c_void_p))
|
|
return result
|
|
|
|
from comtypes.test.find_memleak import find_memleak
|
|
|
|
class Test(unittest.TestCase):
|
|
def check_leaks(self, func):
|
|
bytes = find_memleak(func, (5, 10))
|
|
self.assertFalse(bytes, "Leaks %d bytes" % bytes)
|
|
|
|
def test_creation(self):
|
|
hist = CreateObject(urlhistLib.UrlHistory)
|
|
for x in hist.EnumURLS():
|
|
x.pwcsUrl, x.pwcsTitle
|
|
## print (x.pwcsUrl, x.pwcsTitle)
|
|
## print x
|
|
def doit():
|
|
for x in hist.EnumURLs():
|
|
pass
|
|
doit()
|
|
self.check_leaks(doit)
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|