Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
VB.NET获取文件路径应用程序teamviewer_Vb.net_Registry - Fatal编程技术网

VB.NET获取文件路径应用程序teamviewer

VB.NET获取文件路径应用程序teamviewer,vb.net,registry,Vb.net,Registry,在我的应用程序中,人们可以使用teamviewer连接到远程计算机。人们可以选择名称并单击连接,teamviewer应用程序将使用正确的参数启动,并启动teamviewer会话 只有一个问题,如何获取teamviewer的安装路径 我想我可以使用注册表来获取路径,所以我写了这段代码 Dim regKey As RegistryKey regKey = Registry.LocalMachine.OpenSubKey("SOFTWARE\Wow6432Node\TeamViewer\Ver

在我的应用程序中,人们可以使用teamviewer连接到远程计算机。人们可以选择名称并单击连接,teamviewer应用程序将使用正确的参数启动,并启动teamviewer会话

只有一个问题,如何获取teamviewer的安装路径

我想我可以使用注册表来获取路径,所以我写了这段代码

Dim regKey As RegistryKey
    regKey = Registry.LocalMachine.OpenSubKey("SOFTWARE\Wow6432Node\TeamViewer\Version7", True)
    TeamViewerPath = regKey.GetValue("InstallationDirectory", AccessibleDescription)
它工作完美,它将获得安装teamviewer的正确路径,但这仅适用于64位Windows 7。我怎样才能使它适用于WindowsXP32位和Windows7 32位

编辑:编写了下面的代码,它工作正常,这可能不是最好或最干净的方法,但它做到了

Dim regKeyW7 As RegistryKey
    Dim regKeyWXP As RegistryKey
    Dim TeamViewerPath As String
    regKeyW7 = Registry.LocalMachine.OpenSubKey("SOFTWARE\Wow6432Node\TeamViewer\Version7", True)
    If regKeyW7 Is Nothing Then
        regKeyWXP = Registry.LocalMachine.OpenSubKey("SOFTWARE\TeamViewer\Version7", True)
        TeamViewerPath = regKeyWXP.GetValue("InstallationDirectory", AccessibleDescription)
        Label21.Text = "Windows XP"
    Else
        TeamViewerPath = regKeyW7.GetValue("InstallationDirectory", AccessibleDescription)
        Label21.Text = "Windows 7"
    End If

如果teamviewer获得的新版本不是7,会发生什么

首先检测windows版本不是更好吗,这样您就可以决定检查什么了

如果我单击按钮从应用程序启动teamviewer,但我没有安装teamviewer?你测试过了吗

我已经安装了teamviewer,并且在注册表中没有installdirectory

您正在使用的键(Wow6432Node)是一个反射器;它是在64位操作系统上运行的32位应用程序的注册表视图。此密钥在32位系统上不存在,并且您的OpenSubKey(“SOFTWARE\Wow6432Node\TeamViewer\Version7”,True)可能会引发异常

见:

如果您觉得必须采用这种方法读取InstallationDirectory,我建议您将可执行文件的构建平台设置为x86,并通过SOFTWARE\TeamViewer\Version7访问密钥,从而无需进行检查。当平台设置为x86时,应用程序将始终从注册表的32位配置单元读取,即使它在x64系统上运行。Windows将自动为您在WOW6432节点下执行查找

我的猜测是,您的目标平台被设置为“任意CPU”,这基本上意味着应用程序将使用执行平台(在运行时)来确定SOFTWARE\TeamViewer\Version7的实际位置。在这种情况下,当您的应用程序在64位系统上运行时,OpenSubKey(“SOFTWARE\TeamViewer\Version7”)将在64位版本的注册表中查找(因此找不到该项,并陷入else状态)。当应用程序使用OpenSubKey(“SOFTWARE\TeamViewer\Version7”)在32位系统上运行时,它确实会找到该值,因为没有64位版本的注册表

有关“任意CPU”和x86的详细讨论,请参阅:


在给变量赋值之前,不要声明变量。您可以(而且应该!)在声明时直接用值初始化它们。您的意思是这样的吗?Dim regKeyW7 As RegistryKey=Registry.LocalMachine.OpenSubKey(“SOFTWARE\Wow6432Node\TeamViewer\Version7”,True)是的,完全正确。事实上,如果指定了
选项Strict On
选项推断On
(无论如何,这是个好主意!),您可以省略
As…
部分,使声明更简洁。@KonradRudolph我发现如果省略
As…
部分,它通常会更混乱;)@尼古拉斯为什么?我建议这是由于变量命名或软件设计(因为类型变得不可共享),而不是由于省略了
As…
。如果变量命名正确,这里提供的信息是完全冗余的。