Application对象问题,Set Application("xxx")=server.createobject("xxx")时出错
代码如下:
<%
set Application("comobj")=server.CreateObject("project1.class1")
%>
出错提示为
应用程序对象 错误 'ASP 0197 : 80004005'
不允许的对象使用
/test.asp,行3
不能添加 apartment 型的对象到应用程序的实质对象中。
但是换成server.createobject("adodb.recordset")则可以,不知道是什么原因。请高手指点
问题点数:100、回复次数:11Top
1 楼antshome(我好累)回复于 2002-09-04 15:15:59 得分 0
补充一下,自定义的组件没有问题
换成
set session("comobj")=server.CreateObject("project1.class1")
可以运行Top
2 楼cmsoft(韦小宝是我的老乡)(草根在路上)回复于 2002-09-04 15:16:45 得分 0
project1.dll注册了没有?Top
3 楼antshome(我好累)回复于 2002-09-04 15:21:08 得分 0
当然注册过了,是在本机编译的,不然set session("comobj")=server.CreateObject("project1.class1")
怎么可以Top
4 楼meetweb(niky)回复于 2002-09-04 15:21:24 得分 5
换成server.createobject("adodb.recordset")则可以
这样说来是你的project1.dll可能写的有问题。或者没有注册Top
5 楼meetweb(niky)回复于 2002-09-04 15:25:06 得分 5
那这样好啦。
请用一个中间变量来取的参数
set aa=server.CreateObject("project1.class1")
Application("comobj")=aa
看行的通否?
Top
6 楼qiushuiwuhen(秋水无恨)回复于 2002-09-04 15:25:12 得分 70
http://www.csdn.net/expert/Topicview1.asp?id=974756
中间那段就会明白了
帮你介绍一下线程模型的问题:
1、Single-threaded:某一时刻只能有一个进程使用组件
2、Apartment-threaded:若干进程都可以使用组件,但只有一个在只定的线程上面
3、Multiple-threaded:若干进程都能使用组件,并且这些进程可以运行于不同的线程之上
4、Both-threaded:对象既可以使单元线程,也可以是自由线程
5、Neutral-threaded:若干个进程都可以使用某组件,并且可以使用指定的一祖线程中的任何一个(win2000中引入)
Top
7 楼yonghengdizhen(等季节一过,繁花就凋落)回复于 2002-09-04 15:25:55 得分 20
是组件线程模型有问题,
你是用的单线程模型.
在单机调试的情况下OK.
但在多用户访问时就会有问题.Top
8 楼antshome(我好累)回复于 2002-09-04 15:28:52 得分 0
组件不可能有问题,我在本机用VB写的标准ActiveX Dll,然后编译成功。
直接用set ss=server.CreateObject("project1.class1")则没有问题
我怀疑是Application的问题。同时我用VC写了一个ATL COM测试了一下,也行不通
Top
9 楼antshome(我好累)回复于 2002-09-04 15:43:18 得分 0
to: qiushuiwuhen(秋水无恨) ,跟线程有关系吗?我是单机调试,即使VB写的组件是单线程,但还是可以用啊。为什么我的代码会出错?
to: meetweb(niky)早试过了,一样的错误
to:yonghengdizhen(孤鹰) 现在问题是单机都不OK
Top
10 楼antshome(我好累)回复于 2002-09-04 15:51:19 得分 0
我知道问题答案了,
在工程属性里-》线程模型从单线程改为单元线程就行了Top
11 楼Lostinet(Hello)回复于 2002-09-04 16:16:23 得分 0
通常使用的线程模型是
single-threaded和free-threaded
single-threaded的意思是,该组件不是线性安全的。
如果你要多条线程同时调用那组件,而又没有处理该组件实例的访问同步,
就有可能引发线程同步错误。
free-threaded相反,它的实现是线性安全的。
如果有多条线程同时对那组件的实例进行操作,也不会有问题。
因为那组件内部已经控制了线程的同步操作。
一个就在我们身边的例子是
Microsoft.XMLDOM是single-threaded的
Microsoft.FreeThreadedXMLDOM是free-threaded的。
所以这样会出错:
Application("xd")=Server.CreateObject("Microsoft.XMLDOM")
而
Application("xd")=Server.CreateObject("Microsoft.FreeThreadedXMLDOM")
就不会。
VB做出来的COM组件是single-threaded的。因为VB本身不支持多线程。
VB可以异步操作,是因为VB的FORM是基于windows消息体制的。就像DHTML那样。
当然如果依赖其他组件,VB可以做到多线程。可惜VB本身就没有对多线程的支持。
ATL做出来的class,要基于才能自动注册成free-threaded的组件模型。
CComObjectRootEx<CComMultiThreadModel>
ASP中:
一般情况下Application集合不可以收集single-threaded模型的组件。
除非一个后台设置的一个选项打开。
Session支持任何线程模型的组件。
但是一旦Session集合收集到一个组件(那是因为访问组件默认值失败时),那么整个Session都会被设置为单线程。。
(意思是,所有同一个Session的请求都不会继续以多线程的方式进行。而是以请求队列的形式来处理。
对于用户,意思是不能同时打开两个页面,时间肯定有绝对的先后)Top





