Citrix环境下Redemption Outlook VBA引用登出后重置的解决方法
Citrix环境下Access VBA Redemption引用登出失效解决方案
这个问题是Citrix非持久化会话的典型配置问题,会话销毁时会默认回滚用户手动添加的非内置VBA COM引用配置,部分场景下Redemption的用户级COM注册信息也会被同步清除,以下是按落地优先级排序的可行方案:
- 方案1:改用晚绑定(零维护,兼容性最好)
完全放弃手动在「工具→引用」菜单勾选Redemption库的操作,所有Redemption相关对象都改为晚绑定方式创建,从根源上规避引用持久化依赖。
代码示例:
这种方式不受Redemption版本差异、dll注册路径变化、Citrix会话重置的影响,是跨环境部署Access数据库的通用最佳实践。开发阶段可以临时开早绑定用智能提示写代码,正式发布前改成晚绑定即可。' 替换原有早绑定声明:Dim rSession As Redemption.RDOSession Dim rSession As Object Set rSession = CreateObject("Redemption.RDOSession") ' 后续对象的属性、方法调用逻辑不需要做任何修改 - 方案2:启动时自动修复早绑定引用(适配必须用早绑定的场景)
如果业务场景必须保留早绑定的智能提示、编译校验优势,可以写一段引用校验逻辑,挂在数据库启动入口(通过AutoExec宏或启动窗体触发),每次打开数据库自动检测Redemption引用状态,丢失就自动补加。
代码示例:
注意使用该方案需要提前在Access信任中心勾选「信任对VBA工程对象模型的访问」,否则代码操作VBA项目引用会触发权限错误。Function AutoFixRedemptionRef() As Boolean Dim ref As Object ' Redemption库固定COM GUID Const REDEMPTION_GUID As String = "{2DF34A40-7A89-4E89-AE35-231A00F83B2D}" ' 按实际使用的Redemption版本修改主次版本号 Const MAJOR_VERSION As Long = 6 Const MINOR_VERSION As Long = 0 On Error Resume Next ' 遍历检查引用是否存在 For Each ref In CurrentProject.VBProject.References If ref.Guid = REDEMPTION_GUID Then AutoFixRedemptionRef = True Exit Function End If Next ' 通过GUID添加引用,不依赖固定dll路径,适配Citrix路径动态变化的场景 CurrentProject.VBProject.References.AddFromGuid REDEMPTION_GUID, MAJOR_VERSION, MINOR_VERSION AutoFixRedemptionRef = (Err.Number = 0) Err.Clear End Function - 方案3:从Citrix环境层面配置持久化规则
联系Citrix管理员调整用户配置管理(UPM/WEM)的持久化白名单,将两类内容加入登出保留范围:- Access用户级VBA引用配置对应的存储路径
- Redemption库COM注册对应的用户态注册表项
配置完成后手动添加的引用会和本地环境表现一致,登出后不会被重置。该方案不需要修改数据库代码,但需要Citrix管理员权限配合。
避坑提示:不要用
AddFromFile方法指定固定dll路径加载Redemption引用,Citrix会话中第三方组件的挂载路径可能随会话动态分配,固定路径的方式依然会出现引用丢失问题。
内容的提问来源于stack exchange,提问作者user525966
相关产品推荐
相关产品推荐

