3

Python 2.6 と win32com について教えてください。

私はPythonの初心者で、次のプログラムを開始するとエラーが発生しました:

import pywintypes
from win32com.client import Dispatch
from time import sleep

ie = Dispatch("InternetExplorer.Application")
ie.visible=1
url='hotfile.com'

ie.navigate(url)
while ie.ReadyState !=4:
    sleep(1)
print 'OK'
..........................
Error message:
 while ie.ReadyState !=4:
 ...

pywintypes.com_error: 
(-2147023179, 'Unknown interface.', None, None)
..........................

しかし、URL を「yahoo.com」などに変更すると、エラーは発生しません。
ReadyState をチェックした結果は、どのように URL に依存する可能性がありますか??

4

1 に答える 1

1

スリープ トリックは IE では機能しません。待っている間、実際にメッセージを送信する必要があります。ちなみに、IE は GUI スレッドに参加しないことを嫌うので、スレッドは機能しないと思います。

これはctypesベースのメッセージ ポンプで、「hotfile.com」と「yahoo.com」の 4 ReadyState を取得できました。現在キューにあるすべてのメッセージをプルし、チェックを実行する前にそれらを処理します。

(はい、これはかなり面倒ですが、これを「pump_messages」関数に入れることができるので、少なくとも見る必要はありません!)

from ctypes import Structure, pointer, windll
from ctypes import c_int, c_long, c_uint
import win32con
import pywintypes
from win32com.client import Dispatch

class POINT(Structure):
    _fields_ = [('x', c_long),
                ('y', c_long)]
    def __init__( self, x=0, y=0 ):
        self.x = x
        self.y = y

class MSG(Structure):
    _fields_ = [('hwnd', c_int),
                ('message', c_uint),
                ('wParam', c_int),
                ('lParam', c_int),
                ('time', c_int),
                ('pt', POINT)]

msg = MSG()
pMsg = pointer(msg)
NULL = c_int(win32con.NULL)

ie = Dispatch("InternetExplorer.Application")
ie.visible=1
url='hotfile.com'
ie.navigate(url)

while True:

    while windll.user32.PeekMessageW( pMsg, NULL, 0, 0, win32con.PM_REMOVE) != 0:
        windll.user32.TranslateMessage(pMsg)
        windll.user32.DispatchMessageW(pMsg)

    if ie.ReadyState == 4:
        print "Gotcha!"
        break
于 2009-12-27T14:36:52.680 に答える