MindScape

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 :: 管理 ::

访问IOleContainer出现“Object reference not set to an instance of an object.”,

谢谢!
从How to get IOleSite interface of the WebBrowser in an ActiveX control一文出发。为访问IOleContainer,特意做了C#封装。但一直出现“Object reference not set to an instance of an object.”, 请问那里有问题啊???

//C#封装
//interface IOleContainer
public enum tagOLECONTF
{
EMBEDDINGS = 1,
LINKS = 2,
OTHERS = 4,
ONLYUSER = 8,
ONLYIFRUNNING = 16,
}
[ComImport,
Guid("0000011B-0000-0000-C000-000000000046"),
InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)]
public interface IOleContainer
{
void EnumObjects([In, MarshalAs(UnmanagedType.U4)] int grfFlags,
[Out, MarshalAs(UnmanagedType.LPArray)] object[] ppenum);
void ParseDisplayName(
[In, MarshalAs(UnmanagedType.Interface)] object pbc,
[In, MarshalAs(UnmanagedType.BStr)] string pszDisplayName,
[Out, MarshalAs(UnmanagedType.LPArray)] int[] pchEaten,
[Out, MarshalAs(UnmanagedType.LPArray)] object[] ppmkOut);

void LockContainer([In, MarshalAs(UnmanagedType.I4)] int fLock);
}

调用代码:
Guid guidIServiceProvider = typeof(IServiceProvider).GUID;
Guid guidIWebBrowser2 = typeof(SHDocVw.IWebBrowser2).GUID;
object objIServiceProvider2;
object objIWebBrowser2;

Type typeIOleObject = this.GetType().GetInterface("IOleObject",true);
object oleClientSite = typeIOleObject.InvokeMember("GetClientSite",
BindingFlags.Instance|BindingFlags.InvokeMethod|BindingFlags.Public,
null,this,null);

//Test; Get GetContainer
IOleClientSite oleClientSite2 = oleClientSite as IOleClientSite;
IOleContainer pOleContainer;
oleClientSite2.GetContainer(out pOleContainer);

object [] objs = new object[20] ;
pOleContainer.EnumObjects((int)tagOLECONTF.EMBEDDINGS, objs); //出错地方
IEnumUnknown pOleEnumObject = objs[0] as IEnumUnknown;
posted on 2005-07-28 18:25  Jonny Yu  阅读(732)  评论(0)    收藏  举报