求助: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);
组件的调用
[解决办法]