能否将自己写的Active X控件作为服务器端控件使用,我快绝望了,求高手帮忙(0x8000ffff灾难性故障)

时间:2022-04-02 12:39:00
这个问题困扰了我好久了,一直没有解决掉,现在离要求完工时间有点紧了,所以很郁闷。如果有哪位高手路过,还请指点一下。
可能有点长,但请帮忙看看吧。因为搜索时发现这个问题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本来就是客户端的东西要,要跟服务器交互可以通过网络与服务器通信嘛