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
);
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
);