【问题标题】:How can I find the ComServer for a TWebBrowser Asynchronous Pluggable Protocol如何找到用于 TWebBrowser 异步可插入协议的 ComServer
【发布时间】:2012-10-24 14:48:24
【问题描述】:

我目前已经成功地为一个应用程序实现了这个演示代码,http://www.jasontpenny.com/blog/2010/03/23/custom-protocol-handler-in-delphi/,但是它似乎只在应用程序是单表单应用程序时才有效。

我发现没有为 CoGetClassObject 返回工厂:

procedure NewProtocolHandler(const aProtocolName: String; aProtocolCallback: TProtocolCallback; aProtocollType: TGUID);
var
    error : HRESULT;
begin
    if _protocol <> '' then
        raise Exception.Create('Currently only supports a single asynchronous pluggable protocol');

    _protocol := aProtocolName;
    _protocolCallback := aProtocolCallback;

    error := CoGetClassObject(Class_AsyncPlugProto_Protocol, CLSCTX_SERVER, nil, IClassFactory, Factory);
    CoInternetGetSession(0, InternetSession, 0);
    InternetSession.RegisterNameSpace(Factory, Class_AsyncPlugProto_Protocol, PChar(_protocol), 0, nil, 0);

    CoCreateInstance(aProtocollType, nil {was IUnknown(Self)}, CLSCTX_INPROC_SERVER, IUnknown, MyProtocol);
end;

我开始相信这是由于初始化部分中的 ComServer 不正确造成的。

initialization
    TComObjectFactory.Create(ComServer, TAsyncPlugProto, Class_AsyncPlugProto_Protocol, 'Protocol', '', ciMultiInstance, tmApartment);
finalization
    EndProtocolHandler;
end. 

我的网络浏览器实际上并不是表单的一部分,因为我允许在我的应用程序中使用多个浏览器,因此浏览器被声明为 TWinControl,如果满足 TWebBrowser 的条件,则通过以下方式创建它:

FBrowser := TWebBrowser.Create(nil);

并访问为:

(FBrowser as TWebBrowser)

我对 Com 函数还很陌生,那么如何才能找到相对于 TWebBrowser 的 ComServer?

【问题讨论】:

  • 等等,你用的是TWebBrowser还是TChromium?您能否编辑您的问题以解决此问题(或描述它的含义)?
  • 这个问题是针对 TWebBrowser 的,即使我的应用程序可以支持 Chromium。关键问题是为 TWebBrowser 找到 ComService。

标签: delphi twebbrowser


【解决方案1】:

我认为您混淆了许多事情。如果您想制作一个 APP,如果您以多种方式使用 COM 对象完成了一些工作,将会有所帮助。

ComServer 对象实际上是一个中心对象,它包含一些 COM 内部结构,可以在 Delphi 项目中使用。由于 Internet Explorer 不是 Delphi 项目,您将无法获得 它的 ComServer。此外,如果您仔细查看 TWebBrowser 对象,您会注意到它也是 IWebBrowser2 对象的 COM 内部的包装器。

TWebBrowser 和 TChromium 是两个独立的项目。 As 是一个很棒的运算符,但它无法将某些内容更改为您想要的任何内容。

如果您想要另一个 APP 示例,请查看此处: http://xxm.svn.sourceforge.net/viewvc/xxm/trunk/Delphi/local/xxmHandler.pas?revision=235&view=markup

【讨论】:

  • 所以看来我对 ComServer 的了解有点缺陷,在两个示例 APP 中,如果不是 TWebBrowser,ComServer 到底指的是什么?忽略这两个浏览器 我只是说关键变量是一个 TWinControl,以防它对 ComServer 产生影响。 (如果 Chromium 未在应用程序中加载,则默认使用 IE)。
  • 啊啊啊看到我在问题中的错误(FBrowser as TChromium)应该是(FBrowser as TWebBrowser),很抱歉造成混淆。
  • 原来这不是 APP 的问题,但我的 COM 设置后,会教我急于求成 :) 干杯
  • @ScottAlexander 你能发布解决方案吗?谢谢。
猜你喜欢
  • 2011-01-02
  • 2013-05-02
  • 1970-01-01
  • 1970-01-01
  • 2010-09-23
  • 2020-04-15
  • 2014-04-23
  • 1970-01-01
  • 2023-03-08
相关资源
最近更新 更多