今天写了两个简单的Activex控件,一个用的MFC,一个用的ATL
用MFC的控件,编译后,直接引用就可以使用了。
用ATL写的控件,编译后,可以添加到VC程序中使用,但在WinForm程序中不可以使用,从工具箱拖拽到form后会报下面的错误:
Failed to create component 'AxHost'. The error message follows: 'System.InvalidOperationException: Unable to initialize component. at System.Windows.Forms.AxHost.DepersistControl() at System.Windows.Forms.AxHost.ActivateAxControl() at System.Windows.Forms.AxHost.TransitionUpTo(Int32 state) at System.Windows.Forms.AxHost.CreateHandle() at System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible) at System.Windows.Forms.Control.CreateControl() at System.Windows.Forms.Control.ControlCollection.Add(Control value) at System.Windows.Forms.Form.ControlCollection.Add(Control value) at System.Windows.Forms.Design.ParentControlDesigner.AddChildControl(Control newChild) at System.Windows.Forms.Design.ParentControlDesigner.AddControl(Control newChild, IDictionary defaultValues) at System.Windows.Forms.Design.ControlDesigner.InitializeNewComponent(IDictionary defaultValues) at System.Windows.Forms.Design.AxHostDesigner.InitializeNewComponent(IDictionary defaultValues)'
查找了半天,有人说用AxImp.exe生产一个代理类可以解决这个问题。
尝试了SDK7.0,SDK7.1,SDK8.0,SDK8.1的AxImp.exe,可以成功生成dll,但是仍然没法使用。
也有人说,可以通过降低.NetFramework版本解决这个问题,2.0,3.0,3.5我都试了下,都不行。
试了VS2010和VS2013都不行,累了,回去了。。。
明天有空再弄吧。。。
今天试了一下,微软你大爷的,同样的操作,VS2008上(XP和Win7)就是好的。。。
真够坑爹啊。。。
再次测试表明:
1、VS2008的ATL控件在高版本的VS上可以插入到WinForm
2、VS2010以上的ATL控件,不能插入到VS2008以上任何版本的WinForm
VS2010以上的ATL控件,插入VS2008时,报的错误与上面不同
Debug Assertion Failed! Program:....... File:......vc\atlmfc\include\atlctl.h Expression:pClientSite == 0 || m_spClientSite == 0 For information on how ....
微软,你自己的产品,兼容性做好一些,你能死啊。。。