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”,
我有以下子项:
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”,