我有以下子项:
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。
有什么想法吗?
感谢。
答案 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",