2012-10-10 18 views
1

我有些遺傳代碼,打開IE瀏覽器,這是短版:德爾福和Internet Explorer,打造「全球」 IE

procedure OpenIE(URL: OleVariant; FieldValues: string = ''); 
var ie : IWebBrowser2; 
begin 
    ie := CreateOleObject('InternetExplorer.Application') as IWebBrowser2; 
    ie.Navigate2(URL, Flags, TargetFrameName, PostData, Headers); 
    ShowWindow(ie.HWND, SW_SHOWMAXIMIZED); 
    ie.Visible := true; 
    ... 
end; 

由於CreateOleObject需要很長的時間來執行,我想有一個「準備「首次運行IE。

例如在Main FormCreate中調用CreateOleObject,然後第一次調用OpenIE使用已經創建的「IE」對象。

對於第二,第三...... OpenIE呼叫 - 只是平常通話 即:= CreateOleObject

當我嘗試代碼時,我得到一些線程和編組的錯誤,我在這方面的新手。什麼是適當的方式來做到這一點(一些小代碼的例子會很好)?

在此先感謝。

+0

你的意思是你正試圖在多線程環境中使用OLE嗎?你能給出錯誤信息嗎? – sybond

回答

7

也許你是在不同的線程中創建瀏覽器實例,然後再發出後續調用。下面的代碼瑣碎的工作原理完全如預期:

type 
    TMainForm = class(TForm) 
    ShowBrowser: TButton; 
    procedure FormCreate(Sender: TObject); 
    procedure ShowBrowserClick(Sender: TObject); 
    private 
    FBrowser: Variant; 
    end; 

procedure TMainForm.FormCreate(Sender: TObject); 
begin 
    FBrowser := CreateOleObject('InternetExplorer.Application'); 
end; 

procedure TMainForm.ShowBrowserClick(Sender: TObject); 
begin 
    FBrowser.Navigate('http://stackoverflow.com'); 
    ShowWindow(FBrowser.HWND, SW_SHOWMAXIMIZED); 
    FBrowser.Visible := True; 
end; 

我不使用IWebBrowser2因爲我沒有進口單位得心應手。但這不會改變任何事情 - 你的問題不會與早期/晚期的約束有關。

顯然FormCreate在GUI線程中運行。而ShowBrowserClick是一個按鈕OnClick事件處理程序。所以它在主GUI線程中運行。

如果您從GUI線程以外的線程調用OpenIE函數,那可以解釋您的錯誤。如果您使用的瀏覽器不是創建該瀏覽器的線程,則會收到一個EOleSysError,其中包含消息該應用程序稱爲一個接口,該接口被編組爲另一個線程

最後,在提問時提供建議。如果您收到錯誤消息,請確保在您的問題中包含確切的錯誤消息。這樣做使我們更有可能提供良好的答案。

+0

謝謝sybond,大衛, 是的,代碼作品謝謝,但在我的應用程序中,我得到: 引發異常類EOleSysError與消息'該應用程序稱爲一個接口,被編組爲不同的線程'。我認爲這是不同的線程,我不知道,它看起來像這樣: IEUnit具有LoadIE和OpenIE的功能 LoadIE從MainFormCreate調用,OpenIE從完全不同的單元調用,我從單獨的線程中調用。 希望這個信息有幫助,謝謝 – Milan

+0

@Milan你應該把這個錯誤信息,而不是一個評論。所以,我認爲你現在知道如何解決你的問題。對? –

+0

你說得對,我剛剛添加了一條評論並粘貼了錯誤消息。這些線程令我困惑,我很抱歉。 – Milan