我正在尝试将应用程序迁移到64位,并且在活动脚本上遇到了一些问题。关于这一点的信息并不多,但我设法找到了这样一个事实,即有64位版本的IActiveScriptParse接口,因此修改了GUID defs以反映如下
SCATID_ActiveScript = '{F0B7A1A1-9847-11cf-8F20-00805F2CD064}';
SCATID_ActiveScriptParse = '{F0B7A1A2-9847-11cf-8F20-00805F2CD064}';
SID_IActiveScript = '{BB1A2AE1-A4F9-11cf-8F20-00805F2CD064}';
{$IFDEF WIN64}
SID_IActiveScriptParse = '{C7EF7658-E1EE-480E-97EA-D52CB4D76D17}';
SID_IActiveScriptParseProcedureOld ='{21F57128-08C9-4638-BA12-22D15D88DC5C}';
SID_IActiveScriptParseProcedure = '{C64713B6-E029-4CC5-9200-438B72890B6A}';
SID_IActiveScriptError = '{B21FB2A1-5B8F-4963-8C21-21450F84ED7F}';
{$ELSE}
SID_IActiveScriptParse = '{BB1A2AE2-A4F9-11cf-8F20-00805F2CD064}';
SID_IActiveScriptParseProcedureOld ='{1CFF0050-6FDD-11d0-9328-00A0C90DCAA9}';
SID_IActiveScriptParseProcedure = '{AA5B6A80-B834-11d0-932F-00A0C90DCAA9}';
SID_IActiveScriptError = '{EAE1BA61-A4ED-11cf-8F20-00805F2CD064}';
{$ENDIF}
SID_IActiveScriptSite = '{DB01A1E3-A42B-11cf-8F20-00805F2CD064}';
SID_IActiveScriptSiteWindow = '{D10F6761-83E9-11cf-8F20-00805F2CD064}';
SID_IActiveScriptSiteInterruptPoll ='{539698A0-CDCA-11CF-A5EB-00AA0047A063}';
SID_IBindEventHandler = '{63CDBCB0-C1B1-11d0-9336-00A0C90DCAA9}';
SID_IActiveScriptStats = '{B8DA6310-E19B-11d0-933C-00A0C90DCAA9}';
这已经修复了大部分的问题,但我留下了一个唠叨的访问违反错误,当我试图添加我的应用程序COM对象到脚本对象使用IActiveScript。AddNamedItem如
ScriptEngine.AddNamedItem(PWideChar(Aname), SCRIPTITEM_GLOBALMEMBERS+SCRIPTITEM_NOCODE+SCRIPTITEM_ISVISIBLE);
对Scriptengine的其他调用似乎运行正常,只有这一个产生AV错误,它在32位模式下正常运行。
在脚本界面更新中是否有我错过的东西?
更新:-感谢Reme Lebeau提供的一些见解。
所以问题发生在IActiveScriptSite。GetItemInfo这似乎是一个回调事件,当对象被添加到脚本引擎使用IActiveScript.AddNamedItem时发生。IActiveScriptSite是由主机实现的,由于某些原因,参数定义不能在64位模式下工作。
原定义
function GetItemInfo(
pstrName: LPCOLESTR;
dwReturnMask: DWORD;
out ppiunkItem: IUnknown;
out ppti: ITypeInfo): HResult; stdcall;
需要改成
function GetItemInfo(
pstrName: LPCOLESTR;
dwReturnMask: DWORD;
out ppiunkItem: Pointer;
out ppti: Pointer): HResult; stdcall;
因此,有了上面描述的GUID更改和上面函数定义的更改,我们就可以继续使用64位和32位了
还需要更改系统。ObjAuto
function GetVariantType(TypeInfo: PTypeInfo): TVarType;
...
tkClass:
{$IFDEF WIN32}
Result := varInteger;
{$ELSE}
Result := varInt64;
{$ENDIF}