首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

ScriptControl控件在运行时是否产生一个新的进程

2013-03-25 
求助:ScriptControl控件在运行时是否产生一个新的进程?ScriptControl控件在运行代码时是否产生一个新的进

求助:ScriptControl控件在运行时是否产生一个新的进程?
ScriptControl控件在运行代码时是否产生一个新的进程?

[解决办法]
不会,因为ScriptControl也是ActiveX控件,ActiveX包括EXE、有UI的控件、无UI的组件三种类型,后两种往往可以统称为ActiveX组件,除了Exe可以有独立进程和线程外(所以VB常用ActiveX EXE实现多线程),后丙者都与宿主处于同一个线程,当然也就是没新的进程的说法了。ScriptControl实际上是调用了Windows Script Host组件。
[解决办法]
如果脚本中有释放鼠标和键盘控制,且VB里使用了DoEvents的话,可以用动态加载和卸载ScriptControl控件的办法来中断脚本运行,动态加载的progid为MSScriptControl.ScriptControl.1,此外还要取消工程属性里“删除有关未使用的ActiveX控件的信息”选项。
[解决办法]
先声明,我的vb技术不是很好

这里面有个比较麻烦的事情,scriptcontrol这个控件是多线程的

正好最近一段儿我正在做脚本解释器,所以可以分享一下我的研究成果

HRESULT GetCurrentScriptThreadID(
    SCRIPTTHREADID *pstidThread  // receives scripting thread identifier
);

Retrieves a scripting-engine-defined identifier for the currently executing thread. The identifier can be used in subsequent calls to script thread execution-control methods such as the IActiveScript::InterruptScriptThread method. 

实际通过手册中会发现 微软的脚本引擎 是多线程操作(如果用线程中止的技术不知道vb6是否支持,貌似

vb6不知道多线程的api)

通常来说脚本引擎 可以依靠状态来解决这样的问题(刚才我想到的方案,我自己的脚本引擎正在支持这个方式)

HRESULT SetScriptState(
    SCRIPTSTATE ss  // identifier of new state
);

Puts the scripting engine into the given state. This method can be called from non-base threads without resulting in a non-base callout to host objects or to the IActiveScriptSite interface. 

typedef enum tagSCRIPTSTATE {
    SCRIPTSTATE_UNINITIALIZED = 0,
    SCRIPTSTATE_INITIALIZED   = 5,
    SCRIPTSTATE_STARTED       = 1,
    SCRIPTSTATE_CONNECTED     = 2,
    SCRIPTSTATE_DISCONNECTED  = 3,
    SCRIPTSTATE_CLOSED        = 4
} SCRIPTSTATE;

Contains named constant values that specify the state of a scripting engine. This enumeration is used by the IActiveScript::GetScriptState, IActiveScript::SetScriptState, and IActiveScriptSite::OnStateChange methods. 

不知道这个方式能不能对楼主有所帮助,我现在试验不了vb6的代码,如果换成vc非托管我没什么问题

用scriptcontrol的架构方案我很好奇,这个正是我现在在做的,不知道楼主为什么选用这个方案


[解决办法]
在 windows 脚本技术手册的最下面就有

script56.chm 这个我前一段儿 又研究了一下, 我最早看这个手册都是6年前的事情了,一直都是

用来当作脚本语法的帮助文档

错误其实也有错误处理的上下文机制的,其实所有的脚本引擎都是一样的,脚本运行时是有运行时上下文

对象的,我自己的脚本引擎支持 多种 事件的注入 而达到高扩展的目的,一些思想也是借鉴了微软的脚本

引擎的思想
[解决办法]
HRESULT InterruptScriptThread(
    SCRIPTTHREADID   stidThread,  // identifier of thread
    const EXCEPINFO *pexcepinfo,  // receives error information
    DWORD dwFlags
);



Interrupts the execution of a running script thread (an event sink, an immediate execution, or a macro invocation). This method can be used to terminate a script that is stuck (in an infinite loop, for example). It can be called from non-base threads without resulting in a non-base callout to host objects or to the IActiveScriptSite method. 


中断 运行时脚本的线程
[解决办法]
研究发现scriptcontrol 控件没有 InterruptScriptThread 方法

你的问题很像 http://topic.csdn.net/u/20070116/11/c78ed7fe-bf4f-4283-8aa5-7837a20bba4f.html 这个问题

您开始在 VBScript 引擎,vbscript.dll,并获得 IActiveScript 和 IActiveScriptParse 接口。
您授予 VBScript 引擎 IActiveScriptSite,引擎稍后用于获取和调用您的对象的实现。
您添加的实施和想要使通过调用 IActiveScript::AddNamedItem() 可用于脚本对象。
您提供通过 IActiveScriptParse::ParseScriptText() 执行脚本文本。请注意这并不实际运行该脚本还。
脚本引擎将立即调用的任何对象,它不能识别,以获取其接口指针您 IActiveScriptSite::GetItemInfo()。
调用与运行脚本的 SCRIPT_STATE_CONNECTED IActiveScript::SetScriptState()。
VBScript 引擎为您分析脚本文本,它在遇到一个方法调用或属性的引用时它委托给您提供的接口实现。

----------------------------------------------

以上为其中解法 不过代价颇大
[解决办法]
试着用过scriptcontrol控件,发现比较写脚本也比较麻烦.
主要是有些方法还得自己精心组织.最近改用Web Service了,呵呵
[解决办法]
试试Me.ScriptControl1.Reset方法,看看能不能终止ScriptControl。
我测试过ScriptControl控件方式,它的运行确实没有产生多线程,更没有多进程,我先编写了一个ActiveX组件,包含一个类,类提供了一个方法来显示当前线程的ID,然后分别在VB和ScriptControl中的VBS中实例化该类,并调用该方法,结果显示二者一致,证明没有产生多线程。
WSH也许是支持多线程的,可能ScriptControl禁止了,因为要支持多线程,还需要散集和列集,破坏了VB本身的运行模式。
[解决办法]
EbExecuteLine可以用ScriptControl的Run和Eval来代替,而且EbExecuteLine好像编译后不能使用。
[解决办法]
ebexecuteline是个vb Ide 函数不能编译运行,SC虽然是多线程组件,但因为vb6本身线程模型的限制,只能在脚本中添加返回函数。还不如写向硬盘写vbs文件,然后执行
[解决办法]
ScriptControl就是IActiveScript的封装,你说的那篇文章好像在04年时就看过,最初好像是发表在天极网上的,当时还用VC实现过,时间长了,都记不大清了,改天再分析吧。
[解决办法]
。。。。。。。你帖的网上都很容易找到的,关键是怎么和vb结合,重点攻关应该还是在vbscript.dll

static CLSID const clsid = {0xb54f3741, 0x5b07, 0x11cf,{0xa4, 0xb0, 0x0, 0xaa, 0x0, 0x4a, 0x55, 0xe8}};
声明组件的clsid 

hr = ::CoCreateInstance(m_clsidEngine,NULL,CLSCTX_INPROC_SERVER,IID_IAct iveScript,(void**)&m_ps);

组件的调用
[解决办法]

引用:
实际上我关心的是:
如何强制终止一个scriptcontrol控件的运行


wsh 对这个有个方案不知道 楼主 是否用得上 

在指定秒数后停止脚本的运行。  

//T:nn 启用超时:脚本可以运行的最大秒数。默认设置是无限制。//T 参数通过设置定时器来防止脚本执行过度。当执行时间超过指定值时,CScript 用 IActiveScript::InterruptThread 方法中断脚本引擎,并终止过程。 

关于vbscript.dll 我再查查,用vc封装一个更好的scriptcontrol给vb调用的代价太大了
[解决办法]
高人讨论,我只能帮顶

热点排行