Python, Pyglet, Win32 API, COM: как вызвать IStream :: Release, если у меня есть только указатель? - PullRequest
3 голосов
/ 05 февраля 2012

Я пытаюсь исправить утечку памяти в Pyglet.Это происходит только на win32, поскольку включает объект IStream, выделенный ole32.CreateStreamOnHGlobal, который не освобождается.

Вы можете найти проблему # 552 на трегере Pyglet , нажав здесь.

Как вы можете видеть в исходном коде, освобождение потока было опущено как элемент TODO:

Комментарий в строке 204 даже включает мой вопрос: Как вызвать IUnknown :: Release on stream?

Поток выделенв строке 142 .Поскольку pyglet не зависит от внешних зависимостей, я не думаю, что смогу использовать pywin32.Все, что мы знаем на стороне Python об объекте потока, это gdiplus.py строка 53

LPSTREAM = c_void_p

Итак, это мой фон - ситуация и ограничения.Теперь мой вопрос - снова.Как я могу вызвать IStream :: Release, если у меня есть только указатель?У меня длительный процесс, который загружает разные изображения каждые 5 секунд или около того, и похоже, что это проблема для меня.Я понимаю C / C ++ и время от времени даже занимаюсь программированием, но я не эксперт по win32 api по любым средствам.Помогите!

Ответы [ 2 ]

1 голос
/ 09 февраля 2012

pyglet включает в себя модуль COM, который взаимодействует с IUnknown (pyglet.com, используется аудиодрайвером dsound).

Этот модуль не существовал, когда был написан интерфейс GDI +.

Вы можете переписать загрузку изображения, чтобы использовать COM-объекты вместо интерфейса C, или просто использовать указатель steam, который вы используете в качестве указателя this для IUnknown.

1 голос
/ 06 февраля 2012

возможно, это помогает, это относится к той же проблеме.

http://bytes.com/topic/python/answers/23946-closing-excel-application

...