VB6:ShellExecute在AppData

时间:2017-06-08 15:18:22

标签: shell vb6 shellexecute appdata

我有以下子项:

Public Sub ShellApp(URL As String)

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

   End If
End Sub

这是由于该子系统需要多个功能而无法更改的图层。

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

C:\ App1.EXE

C:\ App2.EXE

C:\用户\ AhmadMusa \应用程序数据\漫游\ App3.exe

前两个应用程序将在所有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),它将很好地打开漫游文件夹。但是无法运行EXE。

有什么想法吗?

感谢。

3 个答案:

答案 0 :(得分:0)

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

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”)将返回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\?

答案 1 :(得分:0)

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

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

以你正确的方式填写其他参数(...)

答案 2 :(得分:0)

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

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

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",