Accessing the Object Model from Within an ActiveX UserControl

Joined
Jul 9, 2008
Messages
1
Reaction score
0
I have been working on an ActiveX component that will be embedded in IE 7.

I've got a problem that I have narrowed down (at least I think I narrowed it down :) ) to a SecurityPermission problem, but haven't had any luck getting it to work.

I'm including part of the code with exception information included.
Code:
 try
 			{
 				SecurityPermission perm = new SecurityPermission(SecurityPermissionFlag.UnmanagedCode);
 
 				//###########################
 				//Assert throws exception
 				//Request for the permission of type 'System.Security.Permissions.SecurityPermission, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' failed.
 
 				//Stack: at System.Security.CodeAccessSecurityEngine.CheckNReturnSO(PermissionToken permToken, CodeAccessPermission demand, StackCrawlMark stackMark, Int32 unrestrcitedOverride, Int32 create) 
 				perm.Assert();
 				//###########################			  
 
 				// Now typeIOleObject has all the required information about class IOleObject
 				Type typeIOleObject = this.GetType().GetInterface("IOleObject", true);
 
 				//###########################
 				//InvokeMember throws exception
 				//Message: IOleObject.GetClientSite()
 				//Stack: 
 				//	   at System.Reflection.MethodBase.PerformSecurityCheck(Object obj, RuntimeMethodHandle method, IntPtr parent, UInt32 invocationFlags)
 				//	   at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
 				//First permission failed: System.Security.PermissionSet
 				object oleClientSite = typeIOleObject.InvokeMember("GetClientSite", BindingFlags.Instance | BindingFlags.InvokeMethod | BindingFlags.Public, null, this, null);
 								
 				//Also tried:  typeIOleObject.InvokeMember("GetClientSite", BindingFlags.InvokeMethod, null, this, null);
 				//###########################
 
 				IServiceProvider serviceProvider = oleClientSite as IServiceProvider;
 				Guid guidIServiceProvider = typeof(IServiceProvider).GUID;
 				object objIServiceProvider;
 				serviceProvider.QueryService(ref SID_STopLevelBrowser, ref guidIServiceProvider, out objIServiceProvider);
 				serviceProvider = objIServiceProvider as IServiceProvider;
 				object objIWebBrowser;
 				Guid guidIWebBrowser = typeof(IWebBrowser).GUID;
 				serviceProvider.QueryService(ref SID_SWebBrowserApp, ref guidIWebBrowser, out objIWebBrowser);
 				IWebBrowser webBrowser = objIWebBrowser as IWebBrowser;
 				MessageBox.Show(webBrowser.LocationURL);
 				object flags = null;
 				object targetFrameName = null;
 				object postData = null;
 				object headers = null;
 				webBrowser.Navigate("about:blank", ref flags, ref targetFrameName, ref postData, ref headers);
 				Console.WriteLine("Called unmanaged code with permission.");
 			}
 			catch (SecurityException ex)
 			{
 				MessageBox.Show(ex.Message + "\n\nStack:" + ex.StackTrace + "\n\nData:" + ex.Data + "\n\nSource:" + ex.Source);
 				MessageBox.Show("\n\nTo String:" + ex.ToString() + "\n\nInner" + ex.InnerException + "\n\nFirst permission failed" + ex.FirstPermissionThatFailed);
 			 }
 			catch (Exception e)
 			{
 				MessageBox.Show(e.Message + "\n\nStack:" + e.StackTrace + "\n\nData:" + e.Data + "\n\nSource:" + e.Source + "\n\nTo String:" + e.ToString() + "\n\nInner" + e.InnerException);
 			}

Wrapper around IWebBrowser
Code:
	  //from shlguid.h
 		Guid SID_STopLevelBrowser = new Guid(0x4C96BE40, 0x915C, 0x11CF, 0x99,
 			0xD3, 0x00, 0xAA, 0x00, 0x4A, 0xE8, 0x37);
 		Guid SID_SWebBrowserApp = new Guid(0x0002DF05, 0x0000, 0x0000, 0xC0,
 			0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46);
 
 		[ComImport, Guid("6d5140c1-7436-11ce-8034-00aa006009fa"),
 			InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
 		public interface IServiceProvider
 		{
 			void QueryService(ref Guid guidService, ref Guid riid,
 		[MarshalAs(UnmanagedType.Interface)] out object ppvObject);
 		}
 
 		[ComImport, TypeLibType((short)0x1050),
 		Guid("EAB22AC1-30C1-11CF-A7EB-0000C05BAE0B")]
 		public interface IWebBrowser
 		{
 			[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime), DispId(100)]
 			 void GoBack();
 			
 			[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime), DispId(0x65)]
 			void GoForward();
 			
 			[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime), DispId(0x66)]
 			void GoHome();
 			
 			[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime), DispId(0x67)]
 			void GoSearch();
 			
 			[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime), DispId(0x68)]
 			void Navigate([In, MarshalAs(UnmanagedType.BStr)] string URL, [In,
 				Optional, MarshalAs(UnmanagedType.Struct)] ref object Flags, [In, Optional,
 				MarshalAs(UnmanagedType.Struct)] ref object TargetFrameName, [In, Optional,
 				MarshalAs(UnmanagedType.Struct)] ref object PostData, [In, Optional,
 				MarshalAs(UnmanagedType.Struct)] ref object Headers);
 
 			[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime), DispId(-550)]
 			void Refresh();
 			
 			[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime), DispId(0x69)]
 			void Refresh2([In, Optional, MarshalAs(UnmanagedType.Struct)] ref object Level);
 			
 			[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime), DispId(0x6a)]
 			void Stop();
 			
 			[DispId(200)]
 			object Application
 			{
 				[return: MarshalAs(UnmanagedType.IDispatch)]
 				[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime), DispId(200)]
 				get;
 			}
 			
 			[DispId(0xc9)]
 			object Parent
 			{
 				[return: MarshalAs(UnmanagedType.IDispatch)]
 				[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime), DispId(0xc9)]
 				get;
 			}
 			
 			[DispId(0xca)]
 			object Container
 			{
 				[return: MarshalAs(UnmanagedType.IDispatch)]
 				[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime), DispId(0xca)]
 				get;
 			}
 			
 			[DispId(0xcb)]
 			object Document
 			{
 				[return: MarshalAs(UnmanagedType.IDispatch)]
 				[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime), DispId(0xcb)]
 				get;
 			}
 			
 			[DispId(0xcc)]
 			bool TopLevelContainer { [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime), DispId(0xcc)] get; }
 			[DispId(0xcd)]
 			string Type
 			{
 				[return: MarshalAs(UnmanagedType.BStr)]
 				[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime), DispId(0xcd)]
 				get;
 			}
 			
 			[DispId(0xce)]
 			int Left
 			{
 				[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime), DispId(0xce)]
 				get;
 				[param: In]
 				[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime), DispId(0xce)]
 				set;
 			}
 			
 			[DispId(0xcf)]
 			int Top
 			{
 				[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime), DispId(0xcf)]
 				get;
 				[param: In]
 				[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime), DispId(0xcf)]
 				set;
 			}
 			
 			[DispId(0xd0)]
 			int Width
 			{
 				[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime), DispId(0xd0)]
 				get;
 				[param: In]
 				[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime), DispId(0xd0)]
 				set;
 			}
 			
 			[DispId(0xd1)]
 			int Height
 			{
 				[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime), DispId(0xd1)]
 				get;
 				[param: In]
 				[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime), DispId(0xd1)]
 				set;
 			}
 			
 			[DispId(210)]
 			string LocationName
 			{
 				[return: MarshalAs(UnmanagedType.BStr)]
 				[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime), DispId(210)]
 				get;
 			}
 			
 			[DispId(0xd3)]
 			string LocationURL
 			{
 				[return: MarshalAs(UnmanagedType.BStr)]
 				[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime), DispId(0xd3)]
 				get;
 			}
 			
 			[DispId(0xd4)]
 			bool Busy { [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime), DispId(0xd4)] get; }
 		}


If it helps any, I have been using this website and this Microsoft support page as references for my code.

Can anyone see what I am doing wrong?



Thanks in advance!
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Similar Threads


Top