【问题标题】:VB6: ShellExecute an EXE inside AppDataVB6:在 AppData 中执行一个 EXE
【发布时间】:2017-06-08 15:18:21
【问题描述】:

我有以下子:

Public Sub ShellApp(URL As String)

        Dim vResult As Long
        vResult = ShellExecute(0, "open", URL, vbNullString, vbNullString, vbMinimizedFocus)

   End If
End Sub

这是在一个无法更改的层上,因为该子需要几个功能。

现在,以我们的 Main() sub 为例,我们检查保存在 EXE 旁边的文本文件中的添加插件列表,并在 for 循环中调用上述 Sub 并使用插件的路径来运行它们。因此,如果我在文本文件中有如下 3 个插件:

C:\App1.EXE

C:\App2.EXE

C:\Users\AhmadMusa\AppData\Roaming\App3.exe

前两个应用程序将在所有 PC 上正常运行(静态路径),但第三个应用程序将无法在除我的 PC 之外的任何 PC 上运行...请注意,App3 始终安装在任何 PC 上的 AppData 上,因此如何动态访问它以从任何 PC 上运行应用程序,而无需对子系统进行调整。

第三个应用程序在文本文件中放置的路径是什么,以便它可以在所有 PC 上运行?

我尝试过 (AppData\Roaming\App3.exe) 但它不起作用...我在一个线程 (http://www.vbforums.com/showthread.php?529776-RESOLVED-Open-a-folder-in-AppData) 上找到了可以调用类似 (shell:AppData\Roaming\App3.exe) 的东西无法运行 App3.exe,但如果我调用 (shell:AppData\Roaming),它将很好地打开 Roaming 文件夹。但无法运行EXE。

有什么想法吗?

谢谢。

【问题讨论】:

  • 好吧,我似乎仍然没有说清楚。我知道如何使用代码获取 AppData 路径,而不是一直通过应用程序数据运行应用程序。我有一个函数,它以我想要运行的路径为参数,然后我执行从参数获取的路径。此参数是自定义的,这意味着它可以更改为您可以想象的任何内容(用户定义)可以是 c:\app.exe 可以是 d:\app.exe 或其他任何内容。现在,我应该向这个参数发送什么在“运行时”运行放置在 AppData 中的应用程序我将在第一次运行时在运行时(从我们保存应用程序路径的缓冲区文件)发送这个参数
  • 如果我理解你的话,用户可以将你的应用程序移动到他们系统上的任何地方,并且你希望保持通过你的界面启动应用程序的能力。如果这是正确的,除非他们将您的应用程序移动到系统路径上的某个位置,否则您将需要一种方法来存储新位置的路径。
  • @jac 我在任何地方安装了一个应用程序,该应用程序可以从内部运行任何第三方应用程序,因此我们有一个选项卡,可以放置所有第三方插件。这样的插件有时在 c 驱动器、d 驱动器或任何地方。现在假设我在 app 数据文件夹中安装了一个应用程序,我如何从我们的应用程序中调用它?我应该在路上放什么?谷歌搜索引导将路径设置为(“shell:AppData\some folder\”),这可以在该位置打开资源管理器,但不运行 exe。

标签: shell vb6 shellexecute appdata


【解决方案1】:

我相信不改变原来的程序“ShellApp”是没有办法解决问题的。

如果你改变主意,我认为这篇文章可能会有所帮助(有一些 tweekings)

Public Sub ShellApp(URL As String)

        Dim vResult As Long
        'vResult = ShellExecute(0, vbNullString, URL, vbNullString, vbNullString, vbNormalFocus)
        vResult = ShellExecute(0, vbNullString, "cmd.exe", "/k """"" & URL & """""", vbNullString, vbNormalFocus)

End Sub

Private Sub Command1_Click()
    ShellApp "%appdata%\PROGRAME.exe"

End Sub

这是因为只有“cmd.exe”和当然批处理脚本能够扩展用百分比字符“%”括起来的变量

要在控制台启动后立即关闭控制台,请将参数“/k”更改为“/c”,

【讨论】:

  • 感谢您的回复。我将看看我是否可以使用您的上述代码将其作为 URL 最初发送以使用 exe 路径运行 cmd,而无需更新功能。因为更新功能需要补丁,而这个补丁要为超过 500 家不同的公司打包 :) 这是从一开始就试图避免的。还是谢谢。
【解决方案2】:
sub test()
    dim tmp as string
    tmp = environ("AppData ") & "\calc.exe"

    call  ShellExecute(..., tmp, ...)
end sub

按照你认为正确的方式填充其他参数 (...)

【讨论】:

    【解决方案3】:

    您需要扩展环境变量(这是%...% 所做的):

    Debug.Print Environ("APPDATA") ' will print the expanded %appdata%
    

    所以,你应该在你的文本文件中输入:

    %APPDATA%\App3.exe

    如何扩展路径?您可以遍历 VB Environ 函数提供的环境变量并自己进行字符串替换(VB 方式),也可以从 ExpandEnvironmentStrings 函数(Win32 API 方式)中获益。

    在使用第二个选项的 sn-p 之下:

    Private Declare Function ExpandEnvironmentStrings Lib "kernel32.dll" _
                    Alias "ExpandEnvironmentStringsA" ( _
                    ByVal lpSrc As String, _
                    ByVal lpDst As String, _
                    ByVal nSize As Long) As Long
    
    Public Function ExpandEnvironString(ByVal URL As String) As String
        Dim buf As String, bufSize As Long
        bufSize = ExpandEnvironmentStrings(URL, ByVal 0&, 0&)
        buf = String(bufSize + 1, vbNullChar)
        bufSize = ExpandEnvironmentStrings(URL, buf, Len(buf))
        ExpandEnvironString = Left$(buf, InStr(1, buf, vbNullChar) - 1)
    End Function
    

    在你调用ShellApp(URL As String)之前你应该扩展路径:

    URL = ExpandEnvironString(URL)
    

    ShellExecute 将收到扩展路径:C:\Users\AhmadMusa\AppData\Roaming\App3.exe

    这是一项非破坏性更改,因为如果您的初始默认设置稍后将更改为自定义固定路径,ExpandEnvironmentStrings 函数将直接忽略它。

    例子:

    ExpandEnvironString("C:\App1.EXE ") 将返回 C:\App1.EXE

    更多信息:

    您可以通过以下过程获取所有环境变量:

    Private Sub EnvironmentEntries()
        Dim Entry As String, i As Long
        i = 1
        Do
            Entry = Environ(i)
            i = i + 1
            If Entry = "" Then Exit Do
            Debug.Print Entry
        Loop
    End Sub
    

    ...并在此处查看一些其他信息:

    Why are there directories called Local, LocalLow, and Roaming under \Users\?

    【讨论】:

    • 我不想通过代码获取 AppData 路径(我已经知道如何)。我想知道发送到 ShellExecute 函数的正确路径是运行放置在 AppData 中的可执行文件。但不在代码内。想法是,如上所述,我们有 ShellExecute 任何客户端想要的功能,默认设置下,我们希望运行放置在 AppData 中的 App,但客户端可以稍后将其更改为 C:\App.exe 或 D:\ XXX\App.exe
    • 在命令前加上“cmd /c”,“/c”部分-可能-是可选的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-20
    • 1970-01-01
    相关资源
    最近更新 更多