2009-03-26 5 views
2

Windows 응용 프로그램의 웹 브라우저 컨트롤에 전달하기 전에 웹 페이지와 함께받은 리소스를 사용자 지정 처리하기 위해 MIME 필터를 만들려고합니다. 이 응용 프로그램은 C#으로 작성되었으며 가능한 경우 관리되는 코드에 MIME 필터를 작성하고 싶습니다. 그래도 문제가 있습니다 : 내 필터 객체가 전혀 호출되지 않는 것 같습니다.IE MIME 필터가 생성되거나 호출되지 않는 이유는 무엇입니까?

여기 내 코드가 있습니다. 미안하지만 너무 길지만 COM 인터페이스에서 뭔가 잘못 정의하고있는 것 같아요. 내가 뭘 잘못하고 있는거야?

[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 */); 
    } 
} 

는 지금까지 내가 말할 수있는, 어떻게해야 그 다음 일은 MimeFilter.CreateInstance() 메소드를 호출 할 필요가 있다는 것입니다. MimeFilter의 다른 메서드도 호출되지 않습니다.

누구든지 제공 할 수있는 도움에 감사드립니다. 감사.

답변

1

MSDN 설명서가 나오고 Visual Studio 2008은 기본 COM 표시 여부에 동의하지 않습니다. MSDN 설명서에 따르면 모든 .NET 유형이 기본적으로 COM에서 볼 수 있지만 Visual Studio 2008 클래스 라이브러리 프로젝트 템플릿은 AssemblyInfo.cs 파일에서 COM 표시 여부를 비활성화합니다.

해결 방법 : AssemblyInfo.cs 파일에서 라인

[assembly: ComVisible(false)] 

를 제거합니다.

COM 인터페이스 선언이 잘못되었을 수 있습니다. 나는 this CodeProject document에서 그들을 대체했습니다.

내가 찾은 유일한 읽을 수있는 MIME 필터 샘플 코드는 here이며 (간단히) documented here입니다.

+0

그렉, 업데이트 된 샘플을 게시 할 수 있습니까? 말하듯이 MIME 필터 샘플은 매우 어렵습니다. 감사! 또는 http://stackoverflow.com/questions/1052871에 추가하십시오. – Rory

관련 문제