我目前已经成功地为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?
答案 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