Microsoft Script Control 64位?

时间:2013-03-21 13:46:19

标签: delphi 64-bit

64位中是否有任何msscript控件? 我谷歌一点,所有人都说没有64位

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

它在XE3中编译好,我已经获得了一个64位的exe,但当它执行到下一行时,

  script := TScriptControl.Create(nil);

它给我一个'Class Not Registered'错误。我只在C:\ windows \ SysWOW64下找到了msscript.ocx,但在System32文件夹下没有这样的文件。

我真的希望这项工作能够快速替代吗?

3 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分:3)

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

答案 2 :(得分:1)

我在将 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();