如何找到用于TWebBrowser异步可插拔协议的ComServer

时间:2012-10-24 14:48:24

标签: delphi twebbrowser

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

我发现在CoGetClassObject中没有返回Factory:

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,则通过以下方式创建: / p>

FBrowser := TWebBrowser.Create(nil);

并访问为:

(FBrowser as TWebBrowser)

我是Com函数的新手,所以如何才能找到相对于TWebBrowser的ComServer?

1 个答案:

答案 0 :(得分:0)

我认为你混淆了许多事情。如果您想制作一个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