| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2636 人关注过本帖
标题:ActiveX Exe 只允许一个进程时创建对象失败
只看楼主 加入收藏
jiashie
Rank: 8Rank: 8
等 级:贵宾
威 望:10
帖 子:237
专家分:999
注 册:2009-4-30
结帖率:100%
收藏
已结贴  问题点数:50 回复次数:11 
ActiveX Exe 只允许一个进程时创建对象失败
有这么一个需求:
1、某程序既要能独立运行(随系统自动启动,我用的是服务的方式),又能在网页中(asp中)调用    ------>于是我想到用ActiveX Exe来做。
2、只能运行一个进程    ------>于是我使用App.PrevInstance 来判断是否有前一个进程,如果有则当前程序结束。
问题来了:
1、如果这个程序只是在网页中通过CreateObject()或GetObject()的方式启动,没有人为地去先点击运行或随系统启动。(一句话,在网页调用之前没有这个进程),那么一切正常。(即使没有用App.PrevInstance 来限制只运行一个进程,而是设置“工程属性->线程缓冲池(1),不管开几个网页,都只有一个进程,很完美)。
2、在网页调用之前,已经存在这个进程,那么在网页中通过CreateObject()或GetObject()的方式启动时,就无法创建对象(App.PrevInstance的限制);如果取消了App.PrevInstance的限制,则会启动第二个进程,甚至还可以再通过手动点击运行n个进程。

有没有办法既 只运行一个进程,又能(当已存在这个进程时)在网页中创建对象?
或者,有没有办法 在创建对象时,如果ActiveX Exe进程已存在,就引用到当前进程中的实例,而不是新创建一个进程。

有点乱。感觉像是个"impossible mission"
testActiveXExe.rar (11.19 KB)


[ 本帖最后由 jiashie 于 2010-7-30 14:04 编辑 ]
搜索更多相关主题的帖子: ActiveX Exe 进程 对象 失败 
2010-07-30 10:35
东海一鱼
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:48
帖 子:757
专家分:4760
注 册:2009-8-10
收藏
得分:16 
那你就不要在检测到进程已经存在(App.PrevInstance)时就立即结束当前进程,你应该完成CreateObject()()或GetObject()的函数语义:
返回前一个Activex exe对象的实例,然后结束。

举世而誉之而不加劝,举世而非之而不加沮,定乎内外之分,辩乎荣辱之境,斯已矣。彼其于世未数数然也。
2010-07-30 13:49
jiashie
Rank: 8Rank: 8
等 级:贵宾
威 望:10
帖 子:237
专家分:999
注 册:2009-4-30
收藏
得分:0 
应该完成CreateObject()()或GetObject()的函数语义:返回前一个Activex exe对象的实例

怎么返回?
2010-07-30 14:03
东海一鱼
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:48
帖 子:757
专家分:4760
注 册:2009-8-10
收藏
得分:0 
就像execl一样,当你创建一个execl自动化对象后,再次创建,他就会返回第一个com对象。
具体实现如下:
调用QueryInterface查询该接口(对象)是否存在,如存在则调用AttachDispatch返回已存在的对象。
否则调用CreateDispatch创建新对象。

举世而誉之而不加劝,举世而非之而不加沮,定乎内外之分,辩乎荣辱之境,斯已矣。彼其于世未数数然也。
2010-07-30 14:29
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4947
专家分:30084
注 册:2008-10-15
收藏
得分:16 
这个好深.
我不会.


授人于鱼,不如授人于渔
早已停用QQ了
2010-07-30 16:03
jiashie
Rank: 8Rank: 8
等 级:贵宾
威 望:10
帖 子:237
专家分:999
注 册:2009-4-30
收藏
得分:0 
以下是引用东海一鱼在2010-7-30 14:29:36的发言:

就像execl一样,当你创建一个execl自动化对象后,再次创建,他就会返回第一个com对象。
具体实现如下:
调用QueryInterface查询该接口(对象)是否存在,如存在则调用AttachDispatch返回已存在的对象。
否则调用CreateDispatch创建新对象。

你的意思是由创建该对象的客户端来"调用QueryInterface查询该接口(对象)是否存在,如存在则调用AttachDispatch返回已存在的对象。
否则调用CreateDispatch创建新对象" ?
还是这个对象自己判断?
如果是前者,那就没有意义了,因为在asp等环境中没办法使用这么高级的函数调用。
2010-08-02 08:29
东海一鱼
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:48
帖 子:757
专家分:4760
注 册:2009-8-10
收藏
得分:0 
不好意思,我没说清楚。应该是在你的Activex exe中判断。

举世而誉之而不加劝,举世而非之而不加沮,定乎内外之分,辩乎荣辱之境,斯已矣。彼其于世未数数然也。
2010-08-02 11:26
三断笛
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:31
帖 子:1621
专家分:1617
注 册:2007-5-24
收藏
得分:16 
先判断getobject是不是nothing,如果是就直接用getobject的返回值,如果不是,再createobject
2010-08-03 01:08
jiashie
Rank: 8Rank: 8
等 级:贵宾
威 望:10
帖 子:237
专家分:999
注 册:2009-4-30
收藏
得分:0 
已经把ActiveX Exe注册到ROT中,在一般的vb代码中,可以用getObject(,className)获得已经运行的对象。
但是,放到asp中使用时,仍然无法用getObject(,className)。这是关键。
估计在Asp中是没办法解决的了?
2010-08-03 07:40
东海一鱼
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:48
帖 子:757
专家分:4760
注 册:2009-8-10
收藏
得分:0 
为什莫不能在ActiveX Exe中操作哪?至不济,也可以先通过消息或管道先关掉上一个实例,然后再创建。

个人看法,说错了别喷我啊。不懂VB的说。


举世而誉之而不加劝,举世而非之而不加沮,定乎内外之分,辩乎荣辱之境,斯已矣。彼其于世未数数然也。
2010-08-03 09:01
快速回复:ActiveX Exe 只允许一个进程时创建对象失败
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.024653 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved