2011-09-17 21 views
4

我發現了以Delphi格式嵌入Chrome的輝煌Delphi Chromium項目。經過一些黑客攻擊後,它在Delphi7中運行良好,我可以運行演示應用程序。使用TChromium在LoadURL上出錯

但是,當我用組件做自己的應用程序時,我無法加載自己的url。我遇到訪問衝突。

Chromium2.Browser.MainFrame.LoadUrl('http://www.example.com'); 

的TChromium組件工作,我必須在正確的地方所有的DLL,因爲如果我設置DefaultUrl它工作正常。

我有一個TPageControl頁面中的Chromium2和一個按鈕的OnClick事件,我稱之爲上面的代碼。我得到一個AccessViolation。大型機是nil

我無法找到解決方法,有沒有人得到這個工作?

+0

你看過源代碼嗎? MainFrame意味着什麼創建? –

+0

你不必手動創建它..當他在一個按鈕的點擊(所以,不是在formcreate ...)得到AV,我99%肯定這是鏈接到缺少的DLL; o) – Whiler

+0

@Whiler,我不認爲我錯過了DLL。它適用於defaultUrl屬性。 –

回答

4

我還是天堂」 t找到了一個分辨率,但我發現了以下解決方法

procedure TForm1.lblWebsiteClick(Sender: TObject); 
var MainFrame : ICefFrame; 
begin 
    MainFrame := Chromium2.Browser.GetMainFrame; 
    MainFrame.LoadUrl('http://www.cookingisfun.ie'); 
end; 
+0

這看起來不像解決方法。這看起來像是如何使用它。文檔的頭版說:「CefFrame表示瀏覽器窗口中的單個框架,每個瀏覽器窗口還有一個頂級主框架,可以通過CefBrowser :: GetMainFrame()方法訪問。」 –

+0

@David,Demo應用程序中的代碼使用了結構中的代碼,我試着嘗試'Chromium2.Browser.MainFrame.LoadUrl('http://www.example.com');'因此大概作者覺得這是它意味着被使用的方式。 –

+0

你有來源。我不。應該很容易看到MainFrame在哪裏被分配(或不)。 –

0

您是否在您的應用程序所在的文件夾中包含所需的全部DLL?

你需要:libcef.dll,icudt.dll,...

入住這thread對他們的支持團隊。


當你建立/運行演示,它們都建在該子文件夾(* DCC_ExeOutput *):DCEF \ BIN \ 這就是爲什麼他們的作品...

+1

@David:如果它們是動態加載的並且GetProcAddress返回nil,它可以。 –

+0

@Rudy'GetProcAddress'返回'nil'似乎不會導致'MainFrame'爲'nil'。 MainFrame聽起來像是一個組件,而不是一個程序地址。是什麼讓你認爲這是一個程序地址?我錯過了什麼? –

+0

我使用這個組件,如果我從我的可執行文件夾中刪除DLL,我有這種行爲...所以,我認爲這就是爲什麼他得到這個AV的原因... – Whiler

3

問題是主機只在加載頁面後加載。

一件事,你需要做的:

if Assigned(Chromium2.Browser.MainFrame) 
    then Chromium2.Browser.MainFrame... 

然而,這不是導航的首選方式,而是你應該做的:

Chromium1.Load(theUrl); 

如果你仍然想使用MainFrame,在OnLoadEnd事件中做。

+0

Chromium1.Load和上面一樣。當MainFrame爲零時它只會失敗。 – migajek

2

過類似的問題和以後相當數小時找到問題:

  1. 如果TChromium是應用程序然後確定的主要形式。

  2. 如果TChromium不是主要形式(或幀上),那麼:

    1. 打開cef.inc並取出點來定義:

      {.$DEFINE CEF_MULTI_THREADED_MESSAGE_LOOP} 
      
    2. 刪除DefaultURL值,從而它是一個空字符串。

我GOOGLE CEF_MULTI_THREADED_MESSAGE_LOOP但它並沒有太多與上來的。

最後,調整大小/刷新問題(即使對齊設置爲alClient)。短期的解決方法是
crmLoadEnd事件中做這樣的事情:

 if crm.Height < panclient.Height then 
     crm.Height := panclient.Height; 
0

有這個問題爲好。看起來MainFrame首先在框架/窗口可見時創建。 但是有一個簡單的方法。直接調用.Load('about:blank')直接在你的TChromium對象上。這會提前初始化丟失的幀。