python、COM和多线程问题

2024-09-28 03:15:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图从调度IE的一个单独的线程中查看IE的DOM,对于一些属性,我得到一个“不支持这样的接口”错误。我设法将问题简化为以下脚本:

import threading, time

import pythoncom
from win32com.client import Dispatch, gencache
gencache.EnsureModule('{3050F1C5-98B5-11CF-BB82-00AA00BDCE0B}', 0, 4, 0) # MSHTML

def main():
    pythoncom.CoInitializeEx(0)
    ie = Dispatch('InternetExplorer.Application')
    ie.Visible = True
    ie.Navigate('http://www.Rhodia-ecommerce.com/')
    while ie.Busy:
        time.sleep(1)

    def printframes():
        pythoncom.CoInitializeEx(0)
        document = ie.Document
        frames = document.getElementsByTagName(u'frame')
        for frame in frames:
            obj = frame.contentWindow

    thr = threading.Thread(target=printframes)
    thr.start()
    thr.join()

if __name__ == '__main__':
    thr = threading.Thread(target=main)
    thr.start()
    thr.join()

frame.contentWindow之前一切都很好。然后bam:

^{pr2}$

有什么提示吗?在


Tags: importtimemaindefdocumentframeiedispatch
1条回答
网友
1楼 · 发布于 2024-09-28 03:15:24

正确的答案是手工整理东西。这不是一个解决办法,这是你应该做的。你不应该使用公寓线程。在

您初始化为多线程单元,它告诉COM,可以在任何线程上调用您的接口。它不允许您调用任何线程上的其他接口,也不允许您整理COM提供的接口。这只会在“意外”中起作用,例如,如果您调用的对象恰好是进程中的MTA对象,则这无关紧要。在

CoMarshalInterThreadInterfaceInStream/CoGetInterfaceAndReleaseStream做生意。在

原因是对象可以提供自己的代理,代理可能是自由线程的,也可能不是自由线程的。(或提供定制编组)。你必须封送它们,告诉它们它们在线程之间移动。如果代理是自由线程的,则可能会返回相同的指针。在

相关问题 更多 >

    热门问题