我试图从我的VB.NET应用程序运行.exe。在我的系统上,一切正常(Win7),但当我发送给我的朋友让他尝试(Win8)时,它所做的就是在资源管理器中打开.exe文件夹位置。
这是我用来运行它的代码:
Public fsxPath As String = My.Computer.Registry.GetValue(
"HKEY_CURRENT_USER\Software\Microsoft\Microsoft Games\Flight Simulator\10.0", "AppPath", Nothing)
Function startFsx()
' Do some things...
Process.Start(fsxPath & "fsx.exe")
Form1.ListView1.Items.Add("Work: START FSX.exe successfull")
Return True
End Function
任何人都知道为什么它对我的朋友不起作用?
编辑: 哦,所以我尝试了我能想到的一切...在我的电脑上fsxPath当我在Msgbox中显示如下:
Msgbox("Path:" & fsxPath & "fsx.exe")
对我来说,它返回" C:\ FSX \ fsx.exe
对于我的朋友,它只是返回" G:\ Flight Simulator X \",fsx.exe部分丢失...
答案 0 :(得分:0)
我不知道为什么它会削减搜索路径,但我的解决方法是将值分配给文本标签,然后为fsxExePath分配标签的值,如下所示:
' Hack to get fsxExePath...
Label1.Text = fsxPath
Label1.Text = Label1.Text & "fsx.exe"
fsxExePath = Label1.Text
Label1.Text = ""
答案 1 :(得分:0)
哦! 7年后。希望这会对某人有所帮助:
您从注册表中获得的字符串可能会在字符串末尾保留一个空终止符以标记该字符串的结尾。那是因为注册表 API 是旧代码,让人想起 C/C++,并且空字符终止符 (&h00) 仍然存在,您不会只是通过 MsgBox/MessageBox 看到它,因为无论如何它在视觉上并不有意义。
当您从注册表中获取字符串时,您要做的第一件事是确保在任何地方都没有空终止符:
Process.Start(fsxPath.Replace(vbNullChar, "") & "fsx.exe")
如果你让空终止符在那里,那么在他的系统上对字符串值的 dot Net 处理似乎只会丢弃你在空终止符之后拥有的任何字符/字符串。在注册表字符串后附加“fsx.exe”不会为您提供一个有效的可执行文件来启动,只有 FSX 目录,为什么它在资源管理器中打开。
至于为什么它是旧版本(Win7 和 Win8)但它仍然在您的系统上运行是由 Microsoft 来回答的。可能是 Win8 很臭,或者他电脑上的 dotNet 版本是忽略了注册表检索字符串中的空终止符的版本。
它在标签中起作用,可能是因为标签 Text 属性本身处理空终止字符串的存在。
无论如何,我解释了可能的原因。如果我错了,你就明白了:也许有一个换行符,或者一个不可打印的字符.. 只需在使用它之前验证注册表中的字符串。