2009-03-26 11 views
2

Ich versuche, einen MIME-Filter zu erstellen, um einige benutzerdefinierte Verarbeitung von Ressourcen, die mit Webseiten empfangen werden, vor der Übergabe an das Webbrowser-Steuerelement in unserer Windows-Anwendung durchzuführen. Die Anwendung ist in C# geschrieben, und ich möchte auch den MIME-Filter in verwaltetem Code schreiben, wenn möglich. Ich habe jedoch Probleme damit: Mein Filterobjekt scheint überhaupt nicht aufgerufen zu werden.Warum wird mein IE MIME-Filter nicht erstellt oder aufgerufen?

Hier ist mein Code. Sorry, es ist so lang, aber ich denke, ich definiere etwas falsch in den COM-Schnittstellen, also schließe ich auch diese ein. Irgendwelche Ideen, was ich falsch mache?

[ComImport] 
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] 
[Guid("00000001-0000-0000-C000-000000000046")] 
public interface IClassFactory 
{ 
    void CreateInstance([MarshalAs(UnmanagedType.IUnknown)] object pUnkOuter, ref Guid riid, out IntPtr ppvObject); 
    void LockServer(bool fLock); 
} 

[ComImport] 
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] 
[Guid("79EAC9E4-BAF9-11CE-8C82-00AA004BA90B")] 
public interface IInternetProtocol : IInternetProtocolRoot 
{ 
    void LockRequest(Int32 dwOptions); 
    [PreserveSig] 
    Int32 Read(IntPtr pv, UInt32 cb, out UInt32 pcbRead); 
    void Seek(Int64 dlibMove, UInt32 dwOrigin, out UInt64 plibNewPosition); 
    void UnlockRequest(); 
} 

[ComImport] 
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] 
[Guid("79EAC9E3-BAF9-11CE-8C82-00AA004BA90B")] 
public interface IInternetProtocolRoot 
{ 
    void Abort(Int32 hrReason, Int32 dwOptions); 
    void Continue(IntPtr pProtocolData); 
    void Resume(); 
    void Start([MarshalAs(UnmanagedType.LPWStr)] string szUrl, IInternetProtocolSink pOIProtSink, 
       IntPtr pOIBindInfo, UInt32 grfPI, IntPtr dwReserved); 
    void Suspend(); 
    void Terminate(Int32 dwOptions); 
} 

[ComImport] 
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] 
[Guid("79EAC9E5-BAF9-11CE-8C82-00AA004BA90B")] 
public interface IInternetProtocolSink 
{ 
    void Switch(IntPtr pProtocolData); 
    void ReportProgress(UInt32 ulStatusCode, [MarshalAs(UnmanagedType.LPWStr)] string szStatusText); 
    void ReportData(UInt32 grfBSCF, UInt32 ulProgress, UInt32 ulProgressMax); 
    void ReportResult(Int32 hrResult, UInt32 dwError, [MarshalAs(UnmanagedType.LPWStr)] string szResult); 
} 

[ComImport] 
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] 
[Guid("79eac9e7-baf9-11ce-8c82-00aa004ba90b")] 
public interface IInternetSession 
{ 
    void CreateBinding(); // Not Implemented 
    void GetCache(); // Not Implemented 
    void GetSessionOption(); // Not Implemented 
    void RegisterMimeFilter([MarshalAs(UnmanagedType.Interface)] IClassFactory pCF, ref Guid rclsid, [MarshalAs(UnmanagedType.LPWStr)] string pwzType); 
    void RegisterNameSpace([MarshalAs(UnmanagedType.Interface)] IClassFactory pCF, ref Guid rclsid, [MarshalAs(UnmanagedType.LPWStr)] string pwzProtocol, 
          UInt32 cPatterns, [MarshalAs(UnmanagedType.LPWStr)] string ppwzPatterns, UInt32 dwReserved); 
    void SetCache(); // Not Implemented 
    void SetSessionOption(); // Not Implemented 
    void UnregisterMimeFilter(IClassFactory pCF, [MarshalAs(UnmanagedType.LPWStr)] string pwzType); 
    void UnregisterNameSpace(IClassFactory pCF, [MarshalAs(UnmanagedType.LPWStr)] string pwzProtocol); 
} 

[ComVisible(true)] 
[InterfaceType(ComInterfaceType.InterfaceIsDual)] 
[Guid("C3ED53DA-EC0E-4625-AB0C-9837D0D0D59D")] 
public interface _MimeFilter : IClassFactory, IInternetProtocol, IInternetProtocolRoot, IInternetProtocolSink 
{ 
} 

[ComVisible(true)] 
[ClassInterface(ClassInterfaceType.None)] 
[Guid("C3ED53DA-EC0E-4625-AB0C-9837D0D0D59D")] 
public class MimeFilter : _MimeFilter 
{ 
    #region [ IClassFactory ] 
    public void CreateInstance([MarshalAs(UnmanagedType.IUnknown)] object pUnkOuter, ref Guid riid, out IntPtr ppvObject) 
    { 
     ... // This is never called 
    } 

    ... 
} 

internal class FilterUtils 
{ 
    /// <summary> 
    /// Registers the MIME filter for the current process 
    /// </summary> 
    public static void RegisterFilter() 
    { 
     IInternetSession session = null; 
     int status = NativeMethods.CoInternetGetSession(0, ref session, 0); 
     MimeFilter mf = new MimeFilter(); 
     Guid id = new Guid("C3ED53DA-EC0E-4625-AB0C-9837D0D0D59D"); 
     session.RegisterMimeFilter(mf, ref id, "text/html; charset=UTF-8"); 
    } 

    private static class NativeMethods 
    { 
     [DllImport("urlmon.dll")] 
     public static extern int CoInternetGetSession(UInt32 dwSessionMode /* = 0 */, ref IInternetSession ppIInternetSession, UInt32 dwReserved /* = 0 */); 
    } 
} 

Soweit ich sagen kann, ist das nächste, was passieren soll, ist, dass die MimeFilter.CreateInstance() Methode aufgerufen werden soll. Es wird nicht aufgerufen, noch sind andere Methoden in MimeFilter.

Ich würde jede Hilfe schätzen, die jemand anbieten kann. Vielen Dank.

Antwort

1

Stellt sich heraus, dass die MSDN-Dokumentation und Visual Studio 2008 über die Standard-COM-Sichtbarkeit nicht übereinstimmen. Die MSDN-Dokumentation besagt, dass alle .NET-Typen standardmäßig für COM sichtbar sind, aber die Visual Studio 2008-Klassenbibliotheksprojektvorlage deaktiviert die COM-Sichtbarkeit in der Datei AssemblyInfo.cs.

Lösung: die Linie

[assembly: ComVisible(false)] 

aus der AssemblyInfo.cs-Datei entfernen.

Ich habe vielleicht auch schlechte COM-Schnittstelle Deklarationen gehabt. Ich habe sie durch die von this CodeProject document ersetzt. Der einzige lesbare MIME-Filter-Beispielcode, den ich gefunden habe, ist here und (kurz) documented here.

+0

Greg, könnten Sie Ihr aktuelles Sample posten - wie Sie sagen, sind Beispiele für MIME-Filter ziemlich schwer zu bekommen. Vielen Dank! Oder fügen Sie http://stackoverflow.com/questions/1052871 hinzu – Rory

Verwandte Themen