IActiveScript中的访问冲突.AddNamedItem Delphi 64位



我正在尝试将应用程序迁移到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}

相关内容

  • 没有找到相关文章