2011-12-29 11 views
1

IHTMLDocument2のMSHTMLドキュメントに基づいて簡単なHTMLパーサーを作成しようとしています。 残念ながら、編集モードを設定しようとすると失敗します。つまり、resultStateは、アプリケーションがハングするように「完了」値を取得しません。それは公式ドキュメントでなければならないベースがIHTMLDocument2インターフェイスののreadyStateプロパティは、「完全」に設定されることはありません、なぜIHTMLDocumentを編集しようとするとアプリケーションがハングする

{$APPTYPE CONSOLE} 

function ParseHtml(doc: TStringList): TStringList; 
var 
    iHtml: IHTMLDocument2; 
    v: Variant; 
    msg: tagMSG; 
begin 
    iHtml := CreateComObject(CLASS_HTMLDocument) as IHTMLDocument2; 
    Result := TStringList.Create; 
    try 
    try 
     iHtml.designMode := 'on'; 
     while iHtml.readyState <> 'complete' do 
     PeekMessage(msg, 0, 0, 0, PM_NOREMOVE); 
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
// above loop never finishes 
     v := VarArrayCreate([0, 0], varVariant); 
     v[0] := doc.Text; 
     iHtml.write(PSafeArray(TVarData(v).VArray)); 
     iHtml.designMode := 'off'; 
     while iHtml.readyState <> 'complete' do 
     PeekMessage(msg, 0, 0, 0, PM_NOREMOVE); 
     // processing iHtml.body 
     ... 
    except 
     ... 
    end; 
    finally 
    ... 
    end; 
    ... 
end; 

begin 
    CoInitialize(nil); 
    ... 
    CoUninitialize; 
end. 

興味があるだけ

答えて

4

オブジェクトにドキュメントを実際にロードするように指示していないため、readyStateプロパティは'complete'に設定されていません。 readyStateプロパティに影響を与えるために、空白のドキュメント(たとえば、'about:blank'のURL)を読み込む必要があります。そうでない場合は、初期値の'uninitialized'のままです。

3

designModeからonに設定する必要はありません。いずれかをポーリングする必要はありませんreadyStatewritecloseの書類を

program Test; 
{$APPTYPE CONSOLE} 
uses 
    SysUtils, 
    MSHTML, 
    ActiveX, 
    ComObj; 

procedure DocumentFromString(Document: IHTMLDocument2; const S: WideString); 
var 
    v: OleVariant; 
begin 
    v := VarArrayCreate([0, 0], varVariant); 
    v[0] := S; 
    Document.Write(PSafeArray(TVarData(v).VArray)); 
    Document.Close; 
end; 

var 
    Document: IHTMLDocument2; 
    Elements: IHTMLElementCollection; 
    Element: IHTMLElement; 
begin 
    CoInitialize(nil); 

    Document := CreateComObject(CLASS_HTMLDocument) as IHTMLDocument2; 
    DocumentFromString(Document, '<b>Hello</b>'); 
    Writeln(string(Document.readyState)); 

    // process the Document here 
    Elements := Document.all.tags('b') as IHTMLElementCollection; 
    Element := Elements.item(0, '') as IHTMLElement; 
    Writeln(string(Element.innerText)); 
    Readln; 

    CoUninitialize; 
end. 
とすぐに "complete"に設定します。
関連する問題