我试图从调度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:
有什么提示吗?在
正确的答案是手工整理东西。这不是一个解决办法,这是你应该做的。你不应该使用公寓线程。在
您初始化为多线程单元,它告诉COM,它可以在任何线程上调用您的接口。它不允许您调用任何线程上的其他接口,也不允许您整理COM提供的接口。这只会在“意外”中起作用,例如,如果您调用的对象恰好是进程中的MTA对象,则这无关紧要。在
CoMarshalInterThreadInterfaceInStream
/CoGetInterfaceAndReleaseStream
做生意。在原因是对象可以提供自己的代理,代理可能是自由线程的,也可能不是自由线程的。(或提供定制编组)。你必须封送它们,告诉它们它们在线程之间移动。如果代理是自由线程的,则可能会返回相同的指针。在
相关问题 更多 >
编程相关推荐