0

伙计们,我已经为此奋斗了几个星期了。我们有一个专有的企业应用程序在我们组织的瘦客户端上运行。通过这个应用程序,我们可以在后台应用 VBA 脚本来执行简单的功能。过去添加按钮来打开 IE 并将它们定向到某些网站以输入数据、打开 Calc 等。

最近我一直在处理下面的代码。它是在服务器上使用启动完整桌面和 explorer.exe 的 RDP 会话开发的。我注意到,如果 explorer.exe 没有运行,那么代码会在函数中读取“ For Each oWin In oShApp.Windows ”,并显示“运行时错误'429'”。

但是,如果我在 ThinClient 上编写脚本以启动 explorer.exe(这很糟糕,因为它启用了开始栏和任务栏),它启动了桌面和全部功能,并且它作为登录的瘦客户端用户运行得很好。我已经阅读了一些关于在使用远程应用程序而不是完整桌面时运行的“有限外壳”的信息,并且想知道它周围是否有任何东西,而不启用开始菜单和任务栏?

请参阅下面的代码。感谢您的帮助,克里特岛

Private Sub cmdHomePage_Click()
Dim ie As Object
Dim sMatch As String
sMatch = "http://www.companyweb.com"
    On Error Resume Next
Set ie = GetIEatURL(sMatch & "*")
On Error GoTo 0
If Not ie Is Nothing Then
    ShowWindow ie.hwnd, 9
    BringWindowToTop ie.hwnd
Else
    Dim strHome
    Dim strAPP
    strHome = "c:\progra~1\intern~1\iexplore.exe www.companyweb.com"
    strAPP = Shell(strHome, vbNormalFocus)
End If
End Sub

Function GetIEatURL(sMatch As String) As Object
Dim ie As Object, oShApp As Object, oWin As Object
Set oShApp = CreateObject("Shell.Application")
For Each oWin In oShApp.Windows
    If TypeName(oWin.Document) = "HTMLDocument" Then
        Set ie = oWin
                If LCase(ie.LocationURL) Like LCase(sMatch) Then
                Set GetIEatURL = ie
        Exit For
                End If
            End If
Next
Set oShApp = Nothing
Set oWin = Nothing
End Function
4

1 回答 1

1

我在 Microsoft 的 RemoteApp 团队工作。我不太清楚您是从实际的 RemoteApp 会话运行此脚本,还是您自己的设置具有替换 explorer.exe 的不同外壳(或者可能根本没有外壳),但无论哪种方式答案都差不多.

您的脚本尝试实例化的 Shell.Application ActiveX 对象似乎是由 shell 实现的 - 通常是 explorer.exe。如果它没有运行,COM 运行时将无法创建对象的实例,并且当您尝试激活它时,您会收到错误消息。

显而易见的解决方案是运行 explorer.exe,但正如您所观察到的,它还包括您可能不想要的任务栏和开始菜单。RemoteApp 运行自己的 shell 替换 (rdpshell.exe),但它没有实现 Shell.Application,因此仅在 RemoteApp 下运行您的应用程序不会解决问题。

我能想到一些潜在的解决方案:

  1. 如果您使用 RemoteApp,您可以编写自己的替换 shell 来实现 Shell.Application。这是相当多的工作,可能没有很多关于如何正确完成的文档。如果您已经有一个替换外壳,您可以扩展它来实现 Shell.Application。
  2. 您可以使用不同的方法来枚举窗口。不幸的是,这可能意味着 Win32(通过 EnumWindows 函数),它不能从 VB 脚本直接访问;您可能必须创建一个实现所需行为的 ActiveX 对象,并从脚本中调用它。
  3. 与选项 2 类似但更重量级 - 您可以让 ActiveX 对象实现整个 Shell.Application 接口 - 即使它实际上不是 shell - 并将其注册到远程机器上。但是,我不能保证您这样做不会遇到问题;这不是我以前尝试过的东西。

不幸的是,这些解决方案都不是理想的,但希望有些东西可以让你做你需要做的事情。

于 2015-10-29T21:53:51.017 回答