异步可插拔协议

使用此作为参考,我正在尝试创建一个异步可插入协议,该协议仅暂时可用于我的应用程序(而不是在系统范围内注册)。 我正在使用CoInternetGetSession ,然后调用RegisterNameSpace来完成它。 但是,当我调用RegisterNameSpace我得到一个AccessViolationexception: Attempting to read or write protected memory

知道发生了什么事吗?

我的代码如下所示:

 [ComImport] [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] [Guid("00000001-0000-0000-C000-000000000046")] [ComVisible(true)] public interface IClassFactory { void CreateInstance(IntPtr pUnkOuter, ref Guid riid, out IntPtr ppvObject); void LockServer(bool fLock); } /* Custom class to act as a class factory that create's an instance of the protocol */ [Guid("0b9c4422-2b6e-4c2d-91b0-9016053ab1b1")] [ComVisible(true),ClassInterface(ClassInterfaceType.AutoDispatch)] public class PluggableProtocolFactory : IClassFactory { public Type AppType; public PluggableProtocolFactory(Type t) { this.AppType = t; } public void CreateInstance(IntPtr pUnkOuter, ref Guid riid, out IntPtr ppvObject) { riid = ProtocolSupport.GetGuid(this.AppType); IInternetProtocol p = Activator.CreateInstance(this.AppType) as IInternetProtocol; ppvObject = Marshal.GetComInterfaceForObject(p, typeof(IInternetProtocol)); } public void LockServer(bool fLock) { var b = fLock; } } [ComVisible(true)] [ComImport] [InterfaceType(ComInterfaceType.InterfaceIsIDispatch)] [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.LPArray,ArraySubType=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(false)] public interface IComRegister { void Register(Type t); void Unregister(Type t); } [ComVisible(false), AttributeUsage(AttributeTargets.Class, AllowMultiple=true) ] public class AsyncProtocolAttribute : Attribute, IComRegister { public string Name; public string Description; [DllImport("urlmon.dll",PreserveSig=false)] public static extern int CoInternetGetSession(UInt32 dwSessionMode /* = 0 */, ref IInternetSession ppIInternetSession, UInt32 dwReserved /* = 0 */); public void Register(Type t) { IInternetSession session = null; CoInternetGetSession(0, ref session, 0); Guid g = new Guid("79EAC9E4-BAF9-11CE-8C82-00AA004BA90B"); session.RegisterNameSpace(new PluggableProtocolFactory(t), ref g, this.Name, 0, null, 0); } 

PluggableProtocolFactory中的CreateInstance方法永远不会被调用。 (一个断点永远不会被击中)所以在RegisterNameSpace方法中发生了其他事情。

我尝试以管理员和普通用户身份运行。 两种情况都有相同的错误。

您在RegisterNameSpace方法中调用PluggableProtocolFactory的构造函数,但不调用CreateInstance方法。 我认为这就是你的问题所在,从来没有创建过传递给你的方法的IInternetProtocol实例。

好吧,想通了:IInternetSession接口的声明是错误的:

这是我从monoblog获得的更好的一个:

 [ComVisible(true), Guid("79eac9e7-baf9-11ce-8c82-00aa004ba90b"),InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)] public interface IInternetSession { [PreserveSig] int RegisterNameSpace( [In] IClassFactory classFactory, [In] ref Guid rclsid, [In, MarshalAs(UnmanagedType.LPWStr)] string pwzProtocol, [In] int cPatterns, [In, MarshalAs(UnmanagedType.LPWStr)] string ppwzPatterns, [In] int dwReserved); [PreserveSig] int UnregisterNameSpace( [In] IClassFactory classFactory, [In, MarshalAs(UnmanagedType.LPWStr)] string pszProtocol); int Bogus1(); int Bogus2(); int Bogus3(); int Bogus4(); int Bogus5(); }