【发布时间】:2016-05-11 06:31:30
【问题描述】:
我目前同时使用 ALM 11.52 和 ALM 12.21。我需要在两个 ALM 版本 9 上运行一个 excel vba 宏,因为有些项目在 11.52 上,有些在 12.21 上)。但是当我尝试连接到 ALM 11.52 上的项目时,我收到一条错误消息,指出 OTA 版本 (12.21) 与 ALM 服务器版本 11.52 不兼容。有什么办法可以解决 OTA 兼容性问题?
【问题讨论】:
我目前同时使用 ALM 11.52 和 ALM 12.21。我需要在两个 ALM 版本 9 上运行一个 excel vba 宏,因为有些项目在 11.52 上,有些在 12.21 上)。但是当我尝试连接到 ALM 11.52 上的项目时,我收到一条错误消息,指出 OTA 版本 (12.21) 与 ALM 服务器版本 11.52 不兼容。有什么办法可以解决 OTA 兼容性问题?
【问题讨论】:
为简单起见,我们可以说 VBA 使用在系统范围级别注册的 OTA。在这种情况下,只能注册一个客户。 坦率地说,您不应该尝试在同一流程中与 2 个不同的客户合作。但是,如果您需要这个,您需要加载 ALM 提供的 Side-By-Side 清单。 默认情况下,位于文件夹中的 ALM 客户端 %LOCALAPPDATA%\HP\ALM 客户端。在文件 Deployments.ini 中,您可以找到确切的 ALM 客户端部署位置(取决于 ALM URL 或版本) 您可以使用文件 application.sxs.manifest 来激活您需要的激活上下文。这是示例代码:
Private Declare Function CreateActCtx Lib "kernel32" Alias "CreateActCtxA" (ByRef pActCtx As ACTCTX_) As Long
Private Declare Sub ReleaseActCtx Lib "kernel32" (ByVal hActCtx As Long)
Private Declare Function ActivateActCtx Lib "kernel32" (ByVal hActCtx As Long, ByRef lpCookie As Long) As Integer
Private Declare Function DeactivateActCtx Lib "kernel32" (ByVal dwFlags As Long, ByVal ulCookie As Long) As Boolean
Private Declare Function GetLastError Lib "kernel32" () As Long
Declare Sub SetLastError Lib "kernel32.dll" (ByVal dwErrCode As Long)
Private Type ACTCTX_
cbSize As Long
dwFlags As Long
lpSource As String
wProcessorArchitecture As Integer
wLangId As Integer
lpAssemblyDirectory As String
lpResourceName As String
lpApplicationName As String
hModule As Long
End Type
Private actctx As ACTCTX_
Private hActCtx As Long
Private actCtxCookie As Long
Const ACTCTX_FLAG_ASSEMBLY_DIRECTORY_VALID As Long = 4
Const INVALID_HANDLE_VALUE As Long = -1
Const CREATE_CONTEXT_ERROR As Long = 1
Const ACTIVATE_CONTEXT_ERROR As Long = 2
Public Sub ActivateOtaContext(ByVal almClientDeploymendPath As String)
Dim actctx As ACTCTX_, ativated As Integer
If Right(almClientDeploymendPath, 1) = "\" Then
almClientDeploymendPath = Left(almClientDeploymendPath, Len(almClientDeploymendPath) - 1)
End If
actctx.cbSize = Len(actctx)
actctx.dwFlags = ACTCTX_FLAG_ASSEMBLY_DIRECTORY_VALID
actctx.lpAssemblyDirectory = almClientDeploymendPath
actctx.lpSource = almClientDeploymendPath & "\application.sxs.manifest"
hActCtx = CreateActCtx(actctx)
If hActCtx = INVALID_HANDLE_VALUE Then
Err.Raise vbObjectError + CREATE_CONTEXT_ERROR, , "Cannot create activation context. Error code: " + GetLastError
End If
If ActivateActCtx(hActCtx, actCtxCookie) <> 1 Then
Err.Raise vbObjectError + ACTIVATE_CONTEXT_ERROR, , "Cannot activate context. Error code: " + GetLastError
End If
End Sub
Public Sub DeactivateOtaContext()
If actCtxCookie > 0 Then
Call DeactivateActCtx(0, actCtxCookie)
actCtxCookie = 0
End If
If hActCtx > 0 Then
Call ReleaseActCtx(hActCtx)
End If
End Sub
Sub Test()
Dim tdConnection As ITDConnection10
Dim AlmClientsBasePath As String
AlmClientsBasePath = Environ("LocalAppData") + "\HP\ALM-Client"
ActivateOtaContext AlmClientsBasePath + "\alm1221"
Set tdConnection = CreateObject("TDApiOle80.TDConnection")
tdConnection.InitConnectionEx "http://alm1221.company.net/qcbin/"
tdConnection.LoginEx "user1", "pwd1"
tdConnection.Logout
tdConnection.ReleaseConnection
Set tdConnection = Nothing
DeactivateOtaContext
ActivateOtaContext AlmClientsBasePath + "\alm115"
Set tdConnection = CreateObject("TDApiOle80.TDConnection")
tdConnection.InitConnectionEx "http://alm.company.net/qcbin/"
tdConnection.LoginEx "user2", "pwd2"
tdConnection.Logout
tdConnection.ReleaseConnection
Set tdConnection = Nothing
DeactivateOtaContext
End Sub
【讨论】: