如题,平时看到mshta执行的是 存在盘上的文件 
因为我的脚本代码不一定是保存在磁盘上的 
可能在内存中 
请高手指点一下 谢谢

解决方案 »

  1.   

    给你一个例子#import "msscript.ocx" no_namespace
    #include<iostream>
    #include<ctime>
    using namespace std;void func()
    {
    srand((unsigned int)time(NULL));
    IScriptControlPtr control;
    control.CreateInstance( __uuidof(ScriptControl) ); control->PutLanguage( "JScript" );
    control->PutAllowUI( VARIANT_FALSE );
    control->AddCode( 
    "function test( arg1 , arg2 ) { return arg1+arg2; }"
    "function myFunc( arg1 , arg2 ) { return arg1+arg2; }" 
    );
    IScriptProcedureCollectionPtr ProcCollection = control->GetProcedures();
    long mCount = ProcCollection->GetCount();
    for( long x=0;x<mCount;x++){
    IScriptProcedurePtr Proc = ProcCollection->GetItem( x+1 );
    cout<<"Procedure Name="<<(const char*)Proc->Name<<"\n";
    cout<<"Args Number="<<Proc->NumArgs<<"\n"; VARIANT var = {0};
    var.vt = VT_I4 ; 
    SAFEARRAYBOUND rgsabound[1]={0};
    rgsabound[0].cElements = Proc->NumArgs;
    SAFEARRAY* psa = SafeArrayCreate( VT_VARIANT, 1, rgsabound);
    for (long i = 0; i < Proc->NumArgs ; i ++){
    var.lVal = rand() ;
    cout<<"param"<<i<<"="<<var.lVal<<" ";
    SafeArrayPutElement ( psa , &i , &var );

    cout<<"\n";
    _variant_t Result = control->Run( Proc->Name , &psa );
    if( VARIANT_FALSE != Proc->HasReturnValue ){
    cout<<(const char*)_bstr_t(Result)<<endl;
    }
    SafeArrayDestroy( psa );
    }
    }
    int main(int argc, char* argv[])
    {
    ::CoInitialize(NULL);
    func();
    ::CoUninitialize();
    return 0;
    }
      

  2.   

    谢谢例子在vc6下执行了例子 
    GetItem( x+1 )处报错 说类型转换错误
    后改为 GetItem( _variant_t((long)(x+1)) ) 执行正确了但这个能解释方法不能生成类似hta的界面 也不能解释html标签 因为脚本里面可能有对标签的操作
    不知道还有没有更好的解决方法最想达到的效果是 和hta 一样的运行结果 但代码是从字符串载入 而不是.hta文件我记得 有个文章 命令行下:mshta 运行js vbs
    mshta javascript:window.execScript("msgBox('hello youniao'):window.close","vbs");
    mshta vbscript:window.execScript("alert('hello youniao');","javascript")但把通常的hta代码加入执行不成..........