【问题标题】:Microsoft Script Control 64 bit?微软脚本控制 64 位?
【发布时间】:2013-03-11 01:37:59
【问题描述】:

有 64 位的 msscript 控件吗? 我google了一下,都说没有64位

我需要 64 位 msscript.ocx 的原因是我想使用 XE3 编译 64 位的 delphi 项目。

它在XE3中编译OK,我得到了一个64位的exe,但是当它执行到下一行时,

  script := TScriptControl.Create(nil);

它给了我一个“类未注册”错误。我只在 C:\windows\SysWOW64 下找到了 msscript.ocx,但在 System32 文件夹下没有这样的文件。

我真的希望它能够工作,所以有什么快速的替代品吗?

【问题讨论】:

    标签: delphi 64-bit


    【解决方案1】:

    这是一个旧帖子。但我刚刚找到了一个非常好的替代 64 位 MSScript 控件(微软没有 64 位 msscript.ocx)

    http://www.eonet.ne.jp/~gakana/tablacus/scriptcontrol_en.html

    我只更改了我的应用程序中的几行代码,它基于此 ScriptControl64 以 64 位运行。

    【讨论】:

    • 这个控件似乎可以工作,但我无法让 Visual Studio 2015 接受它作为有效的 COM 对象。当我在项目中留下原始的 32 位 MS Script 控件引用时,当 Tablacus 与它一起注册时,VS 将为 AnyCPU 和 x86 编译我的应用程序,但 TlbImp 给出错误“与输入类型库兼容的单一有效机器类型必须指定”当我尝试为 X64 编译时。当我尝试直接将 dll 作为参考添加(浏览)时,Visual Stdio 说它无法添加它。
    • 我之前的评论:它确实有效,而不仅仅是“似乎”。我的应用程序,参考 MSScript.ocx 并为 AnyCPU 编译,如果安装(注册)自动使用这个 64 位 dll,无需更改源代码。未安装 dll 时,它会按预期失败,因为它在 64 位模式下运行,并且只有 32 位版本。所以唯一的问题是让 Visual Studio 也接受它。
    • 它还可以在我的 VBA 64 位项目(Access 和 Excel)中使用 Late Binding 实现零代码更改。 Early Binding 但是,我无法设置,即使尝试直接引用 tsc64.dll 文件也是如此。
    【解决方案2】:

    msscript 组件未移植到 64 位。这是一个遗留组件,MS 选择不努力将其迁移到 64 位。您只需要找到另一种方法来执行您对该组件所做的任何事情。

    【讨论】:

    • 这就是我避免像瘟疫这样的外部控制的原因 - 很多年前我被 TWebBrowser 或现在所谓的移动目标咬伤了很多次。
    • 有趣的事实是 InternetExplorer 已被移植到 64 位:support.microsoft.com/kb/896457/en
    • 我发现您更改已接受的答案有点令人失望。您问“64 位是否有任何 msscript 控件?”。我回答了。
    • @David Heffernan 恕我直言,我还问“所以有什么快速的替代品吗?”现在简单地回答“不”是不够的。
    【解决方案3】:

    我在将 c++ 应用程序从 32 位移植到 64 位时遇到了同样的问题。 我知道这个问题是在 Delphi 上提出的,但我希望有人可以利用这些信息或将其转移到其他语言。

    我们通过 CreateDispatch 启动“ScriptControl”(MSScriptControl.ScriptControl.1)。 控制信息位于 Computer\HKEY_LOCAL_MACHINE\SOFTWARE\Classes\ScriptControl 我们在 32 位中使用这个 MS 控件执行 VBS 或 JScript:

    COleDispatchDriver* m_dispScriptControl = new COleDispatchDriver();
    if (m_dispScriptControl)
    {
       if (m_dispScriptControl->CreateDispatch(_T("ScriptControl")))
       {
         ...
         .... setting language to be used and other proteries .. then execute script code:
    
          _variant_t varResult;
          VariantClear(&varResult);
          EXCEPINFO    excepinfo;
          VARIANT parameters;
          parameters.vt = VT_BSTR;
          parameters.bstrVal = strScriptCodeWCHAR;
    
          DISPPARAMS dispparams;
          dispparams.rgdispidNamedArgs = NULL;
          dispparams.cNamedArgs = 0;
          dispparams.cArgs = 1;
          dispparams.rgvarg = &parameters;
          unsigned int uArgErr = 0;
    
          if (S_OK != m_dispScriptControl->m_lpDispatch->Invoke(0x7d2, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_METHOD, &dispparams, &varResult, &excepinfo, &uArgErr))
    ...
    
       }
    

    经过一些研究,似乎不可能创建 MSDN 查询中的 64 位应用程序中的 ScriptControl:

    问题是:我的窗体应用程序目前工作正常 在 32 位应用程序上,我正在调查,所以我们可以将它安装在 64 位计算机,但继续启动应用程序如下。

    类未注册(HRESULT 异常:0x80040154 (REGDB_E_CLASSNOTREG))

    错误位于 AxInterop.MSScriptControl.dll 上

    Awnser 是:如果它只存在于 C:\Windows\SysWOW64 中,那么您的 .Net 应用程序无法在 64 位模式下运行。确保你编译它 x86 而不是任何 CPU。然后你就可以在 64 位中使用它了 Windows,但它将是一个 32 位进程。

    https://social.msdn.microsoft.com/Forums/windows/en-US/1e9ddfe4-3408-4a34-ba43-a1a0931daebd/64-bit-windows-7?forum=clr

    我们不满意,因为我们想以 64 位进程运行

    我们的解决方案是使用 Microsoft IActiveScript Interface。并在我们的主窗口上实现了同样的功能:

    BEGIN_INTERFACE_PART(ActiveScriptSite, IActiveScriptSite)
            STDMETHOD(GetLCID)(LCID*);
            STDMETHOD(GetItemInfo)(LPCOLESTR, DWORD, LPUNKNOWN*, LPTYPEINFO*);
            STDMETHOD(GetDocVersionString)(BSTR*);
            STDMETHOD(OnScriptTerminate)(const VARIANT*, const EXCEPINFO*);
            STDMETHOD(OnStateChange)(SCRIPTSTATE);
            STDMETHOD(OnScriptError)(IActiveScriptError*);
            STDMETHOD(OnEnterScript)();
            STDMETHOD(OnLeaveScript)();
    END_INTERFACE_PART(ActiveScriptSite)
    

    现在,当我们必须执行脚本代码时,我们执行以下操作,这在我们构建的 64 位和 32 位版本中运行良好:

     CString strLanguage;
     if (nLanguage == 1)
     {
        strLanguage = _T("VBScript");
     }
     else
     {
       strLanguage = _T("JScript");
     }
        
    CComPtr<IActiveScript> m_pAxsScript;
    HRESULT hr = m_pAxsScript.CoCreateInstance(CT2W(strLanguage), NULL, CLSCTX_INPROC_SERVER | CLSCTX_INPROC_HANDLER); 
        
    m_pAxsScript->SetScriptSite(&m_xActiveScriptSite); //m_xActiveScriptSite is a member of the interface
    
    CComQIPtr<IActiveScriptParse> m_pAxsScriptParse = m_pAxsScript;
    
    m_pAxsScriptParse->InitNew();
    
    
    EXCEPINFO pException = { 0 };
    hr = m_pAxsScriptParse->ParseScriptText(_bstr_t(strCode), 0, NULL, NULL, dw, 0, 0, NULL, &pException);
    
    //execute script
    m_pAxsScript->SetScriptState(SCRIPTSTATE_CONNECTED);
    
    m_pAxsScriptParse.Release();
    m_pAxsScriptParse = nullptr;
    
    hr = m_pAxsScript->SetScriptState(SCRIPTSTATE_DISCONNECTED);
    ASSERT(hr == S_OK);
    
    m_pAxsScript->Close();
    m_pAxsScript.Release();
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-25
    • 1970-01-01
    • 2011-04-07
    • 2015-07-08
    • 2010-09-24
    • 1970-01-01
    • 2011-01-26
    相关资源
    最近更新 更多