就象maya(还有很多软件)一样,可以通过内嵌的maya embedded lanugage 脚本控制几乎所有maya 软件的功能,甚至能动态的生成GUI。这样,由于脚本的跨平台性和解释性,可以方便地进行二次开发。而可以在运行时倒入插件大大扩充了软件的功能。但我不知道这些功能是如何实现的,哪位大哥能帮帮我?或给我一些提示和资料?非常感谢!!

解决方案 »

  1.   

    you only have to pass IDispatch* to the script function.
    void CScriptDemoDlg::OnTestOwnctrl() 
    {//http://61.133.87.165/bbs/attachment.php?s=&postid=382458
    //http://www.codeproject.com/com/ScriptDemo.asp

    // TODO: Add your control notification handler code here
    LPUNKNOWN lpknow=m_mytestctrl.GetControlUnknown();
    if(!lpknow)
    return;
    LPDISPATCH lpDisp=NULL;
    HRESULT hr=lpknow->QueryInterface(IID_IDispatch,(void**)(&lpDisp));
    if(FAILED(hr)||NULL==lpDisp)
    return;
    CString  strProc;
    CString strCode = "function TestMyCtrl(obj) \n {\n obj.test(\"called by my test script in 319\");\n }\n";
    m_ctlFunctions.GetWindowText( strProc );
    strProc = "TestMyCtrl";
    if (!m_ScriptObj.AddScript( strCode ))
    {
    CString strError = m_ScriptObj.GetErrorString();
    m_ctlResult.SetWindowText( strError );
    }
    else
    m_ctlResult.SetWindowText( _T("") );

    /*
    function TestMyCtrl(obj)

    obj.test("a");
    }   Function TestMyCtrl(obj)
      obj.test("aafdsadfdsgdasgsdf")
      End Function
    */
       
    CSafeArrayHelper sfHelper;
        try{
            _variant_t var;
            sfHelper.Create(VT_VARIANT, 1, 0, 1);    // 1 parameter
    var = lpDisp;
            sfHelper.PutElement(0, (void*)&var);    // parameter1 -> index 0
            LPSAFEARRAY sa =  sfHelper.GetArray();
            _variant_t varRet;
            if (m_ScriptObj.RunProcedure(strProc, &sa, &varRet))
                m_ctlResult.SetWindowText( (LPCTSTR)(_bstr_t(varRet)) );
            else
            {
                CString strError = m_ScriptObj.GetErrorString();
                m_ctlResult.SetWindowText( strError );
            }
        }
        catch(...)
        {
            CString strError = m_ScriptObj.GetErrorString();
            m_ctlResult.SetWindowText( strError );
        }
    }
    I define an ATL control, with a method HRESULT Test([in]BSTR bstrparam);
    insert this control into a dialog;
    add a memeber to the dialog class
    CMyScriptCtrl m_mytestctrl;
    use helper code found in http://www.codeproject.com/com/ScriptDemo.asp to execute its method by script, and it works!
      

  2.   

    谢谢指点!但是如果考虑到移植的问题,比方说在linux下无法用atl,那怎么办?我的意思是能否用一般的c++来实现?
      

  3.   

    脚本宿主的例子
    ms-help://MS.VSCC/MS.MSDNVS/vcsample/html/vcsmpTSTCONActiveXControlTestContainer.htm