- 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.
Wrapper around IWebBrowser
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!
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!