VB6: ShellExecute 一个 EXE inside AppData

VB6: ShellExecute an EXE inside AppData

我有以下子项:

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 上运行,这是不正常的...请注意,App3 始终安装在任何 PC 上的 AppData 上PC,那么如何从任何 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) 它会很好地打开漫游文件夹。但是不能运行 EXE.

有什么想法吗?

谢谢。

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

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

因此,在您的文本文件中,您应该输入:

%APPDATA%\App3.exe

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

下面是使用第二个选项的片段:

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 ") will return 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\?

sub test()
    dim tmp as string
    tmp = environ("AppData ") & "\calc.exe"

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

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

我认为不改变原来的程序是无法解决问题的"ShellApp"。

如果您改变主意,我想这个 post 可能会有所帮助(有一些 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”,