首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Server2016上将VB6编译为后台进程

在Server2016上将VB6编译为后台进程
EN

Stack Overflow用户
提问于 2018-12-04 23:03:27
回答 1查看 454关注 0票数 5

我们有一种非常奇怪的行为,我无法确定其根本原因。我们使用TFS (2017.U2)来编译我们的遗留系统,并尝试从2008R2到2016年更新我们的构建场。构建系统使用PowerShell (v5)来遍历VBP项目列表,并运行VBS脚本来编译这些项目。

首先是一些基础知识。UAC被完全禁用(在注册表中,不仅仅是滑块控件),VB6.EXE也被设置为XP SP3兼容性,并以管理员身份运行。

不幸的是,虽然我们可以看到VB6.EXE在任务管理器中启动-但它只是挂起了。零活动。对于相同的用户,以交互方式运行相同的编译效果很好。这导致我推测这是一个环境问题,然而process explorer向我展示了VB6.EXE进程上的有效用户环境。

我不认为这是因为VB6抛出了错误,因为(至少在以前的Windows Server版本中)当后台进程打开UI元素时,操作系统会向前台指示后台想要插入。我们没有看到这一点。

我们把这段代码还原成一个最小的代码示例,我称之为"test.ps1":

代码语言:javascript
复制
$vb6="C:\Program Files (x86)\Microsoft Visual Studio\VB98\vb6.exe"
Set-Location D:\Builds\27\s\path\prjdir
start-process $vb6 -ArgumentList "/make /out errors.txt project.vbp"  -wait

我们一直使用"start-process“来触发VB6编译,因为通过PowerShell的直接调用没有正确地摄取参数(它们实际上是在完全成熟的过程中由传递到主脚本中的字符串构建的……这是简化版本)。

当以交互方式运行(.\test.ps1)时,它可以正常工作。项目被编译了,我得到了一个errors.txt文件。

当作为一个进程(start-process .\test.ps1)启动时,它再次正常工作。

当通过TFS "PowerShell脚本“任务触发时,这将无法完成VB6步骤-可以在任务查看器中使用适当的参数看到VB6.EXE,并且没有与任务相关联的CPU或IO。未写入任何errors.txt文件。不创建新的DLL。

通过从另一台机器上运行测试脚本,我可以进一步将其简化,并从堆栈中删除TFS。我运行了脚本的远程调用,并使用以下命令复制了结果:

代码语言:javascript
复制
PS C:\Users\svc_build> Invoke-Command –ComputerName TestBuild02 –ScriptBlock {powershell  C:\Users\svc_build\desktop\test.ps1 }

同样,没有errors.txt,也没有新的DLL。VB6.EXE启动,然后就坐在那里。进程监视器不能提供任何帮助来诊断可能的问题。

现在,这闻起来像是安全门对我关闭了-即使相同的域用户正在运行相同的作业,不同之处在于这是一个后台进程……并且某些东西正在阻止后台进程在与前台进程相同的上下文中执行。

假设这个假设是正确的,有人能告诉我远程触发的(后台)会话不能运行VB6.EXE的原因吗?(当然,对于这种情况,我们会很感激:)

如果这不是一个安全问题--有没有人能找出真正的罪魁祸首,以及像我们习惯于在W2K8R2上看到的那样,让VB6作为后台进程运行的解决方案?

EN

回答 1

Stack Overflow用户

发布于 2020-07-29 11:21:41

我参加聚会有点晚了,但这听起来像是我刚刚遇到的非常相似的场景。

通过PowerShell脚本运行VB6.exe

  • Windows10 v2004
  • UAC disabled
  • Compiling。使用竹子作为生成服务器的
  • ,以托管服务帐户运行。

当在服务器上通过竹子运行构建时,它挂起了。当登录到构建服务器并手动运行构建时,成功了。

在减少代码后,我能够重现一个最小的失败案例。挂起是由操作UI控件的用户控件的UserControl_Initialize方法中的代码引起的,但仅当该UserControl放置在同一项目中的窗体上时才会导致挂起。

在编译期间,编译器将创建表单的一个实例(为什么,我不知道),这又创建了UserControl的一个实例,该实例又运行UserControl_Initialize方法。我只能假设在这一点上运行代码会导致某种类型的错误,从而导致编译器挂起。

UserControl_Resize事件可能会导致相同的错误。通过在尝试调整子控件大小之前检查Ambient.UserMode是否为真,可以相当容易地修复这种情况。

代码语言:javascript
复制
Private Sub UserControl_Resize()
    If UserControl.Ambient.UserMode Then
        ' Position the child controls
    End If
End Sub

修复UserControl_Initialize方法需要在不同的点运行这些方法中的代码(例如,当给UserControl提供要显示的数据时,我们现在运行以前在UserControl_Initialize中的代码)。

同样值得注意的是我们必须使用的VB6.exe的兼容性设置。使用"Windows XP SP3“兼容模式会导致VB6.exe立即挂起。我们必须将其设置为不使用任何兼容模式,但我们必须将此程序设置为以管理员身份运行,并将其应用于所有用户。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53615794

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档