可能有点长,但请帮忙看看吧。因为搜索时发现这个问题02年就有人提出了,但一直没有很好的解决。。。
我之前通过VC++6.0的MFC ActiveXControlWizard创建了一个Active X控件,用来显示图形。
我在VS2005的C#项目中,在WinForm上,通过在工具箱中添加这个控件,然后拖放到窗口上,在cs文件中可以方便的设置参数,调用控件方法。很成功。
然后我想在C#网站中也能够使用这个控件。因为控件的初始化需要调用控件本身的方法,所以按照一般的用<object id=...>,然后在写<script>写相应的事件处理肯定不行。我觉得如果能够像在WinForm中一样,直接在cs文件中进行参数设置、方法调用就很方便了。
于是我在网站-添加引用中添加了这个控件,产生了Interop.PROLib.dll和stdole.dll两个文件。
我在cs文件中写如下代码进行实验:
using PROLib;
public partial class MainPage : System.Web.UI.Page
{
protected ProClass Pro1 = new ProClass();
protected void Page_Load(object sender, EventArgs e)
{
Pro1.Percent = 0.75;
}
}
同时在aspx文件中写如下代码:
<object id=" <%=Pro1%>" width="300" height="100" classid="CLSID:########-####-####-####-############">
</object>
结果编译的时候,在Pro1.Percent=0.75;这一句提示错误:
用户代码未处理COMException
灾难性故障 (异常来自 HRESULT:0x8000FFFF (E_UNEXPECTED))
错误具体内容是:
用户代码未处理 System.Runtime.InteropServices.COMException
Message="灾难性故障 (异常来自 HRESULT:0x8000FFFF (E_UNEXPECTED))"
Source="mscorlib"
ErrorCode=-2147418113
StackTrace:
在 System.RuntimeType.ForwardCallToInvokeMember(String memberName, BindingFlags flags, Object target, Int32[] aWrapperTypes, MessageData& msgData)
在 PROLib.ProClass.get_Percent()
在 MainPage.Page_Load(Object sender, EventArgs e) 位置 d:\CSharpWebSiteExample\MainPage.aspx.cs:行号 29
在 System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e)
在 System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e)
在 System.Web.UI.Control.OnLoad(EventArgs e)
在 System.Web.UI.Control.LoadRecursive()
在 System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
之后我在论坛和百度等地搜索0x8000ffff问题,结果发现这个问题早在2002年就已经有人提出来了,而且提问的数量相当多,但是结果中解决的微乎其微,即使有说成功了的,也没有在帖子中具体讲。。。
经过总结,感觉主要有以下几种观点和思路:
1、Active X控件只能在客户端使用,不能作为服务器端控件,所以我的做法根本不可行。只能用<object>+<script>方式。但这样一来,我的控件就无法初始化,根本无法使用了。
2、Active X控件需要有容器,在网页中缺少容器。
3、COM和.Net还是有不同。COM的TypeLib和.Net的MetaData之间要进行转换。
我感觉是COM和.Net之间有区别的原因。感觉可能是Active X控件的接口参数和接口方法的类型在.Net中识别不出来。但是具体该怎么解决就不知道了。
这个将Active X控件使用到网页上的问题困扰了我很久了,感觉自己的路越走,希望越小。现在时间也越来越紧,在犹豫是否放弃,又有点不心甘。希望各位能购帮忙下,不甚感激!
6 个解决方案
#1
LZ这个我去年也做个类似的东西,也是折腾了好久,就是没法把OCX所有的功能放到页面上。还是把代码拿来,重新写比较好搞。就算你搞成了,用户对ActiveX运行是还是要确认安全,用起来很不友好。你要是能搞成也告诉我下。关注
#2
哦,还是谢谢caotaolei,我现在也正在考虑是否直接写个cs类算了。
#3
这个问题的关注程度怎么这么低阿?。。。大家路过都来看看啊,不会的也帮忙顶下吧。。。
#4
帮顶一下,同问。。
#5
这个问题我也遇到过,不知怎样解决
#6
ActiveX本来就是客户端的东西要,要跟服务器交互可以通过网络与服务器通信嘛
#1
LZ这个我去年也做个类似的东西,也是折腾了好久,就是没法把OCX所有的功能放到页面上。还是把代码拿来,重新写比较好搞。就算你搞成了,用户对ActiveX运行是还是要确认安全,用起来很不友好。你要是能搞成也告诉我下。关注
#2
哦,还是谢谢caotaolei,我现在也正在考虑是否直接写个cs类算了。
#3
这个问题的关注程度怎么这么低阿?。。。大家路过都来看看啊,不会的也帮忙顶下吧。。。
#4
帮顶一下,同问。。
#5
这个问题我也遇到过,不知怎样解决
#6
ActiveX本来就是客户端的东西要,要跟服务器交互可以通过网络与服务器通信嘛