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文件夹下没有这样的文件。
我真的希望这项工作能够快速替代吗?
答案 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 = ¶meters;
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 位进程。
我们不满意,因为我们想作为 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();