2011-09-17 52 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对象上。这会提前初始化丢失的帧。