0

現在、このデモ コードを 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. 

アプリケーションで複数のブラウザを使用できるようにしたため、Web ブラウザは実際にはフォームの一部ではありません。そのため、Browser は TWinControl として宣言され、TWebBrowser の条件が満たされている場合は、次の方法で作成されます。

FBrowser := TWebBrowser.Create(nil);

次のようにアクセスします。

(FBrowser as TWebBrowser)

私は Com 関数にかなり慣れていないので、TWebBrowser に関連する ComServer を見つけるにはどうすればよいですか?

4

1 に答える 1

0

私はあなたが多くのことを混乱させていると思います。APP を作成したい場合は、いくつかの方法で COM オブジェクトを操作したことがあると役立ちます。

ComServer オブジェクトは実際には中心的なオブジェクトであり、COM 内部の一部をラップしており、Delphi プロジェクトですぐに使用できます。Internet Explorer は Delphi プロジェクトではないため、その ComServerを取得することはできません。また、TWebBrowser オブジェクトをよく見ると、IWebBrowser2 オブジェクトの COM 内部のラッパーでもあることがわかります。

TWebBrowser と TChromium は、2 つの別個のプロジェクトです。Asは優れた演算子ですが、何かを好きなように変更することはできません。

APP の別の例が必要な場合は、こちらをご覧ください: http://xxm.svn.sourceforge.net/viewvc/xxm/trunk/Delphi/local/xxmHandler.pas?revision=235&view=markup

于 2012-10-24T18:00:19.330 に答える