【问题标题】:VB.NET Getting file path application teamviewerVB.NET获取文件路径应用teamviewer
【发布时间】:2012-01-25 08:59:34
【问题描述】:

在我的应用程序中,人们可以使用 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。我如何才能使其适用于 Windows XP 32 位和 Windows 7 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

【问题讨论】:

  • 在赋值之前不要声明变量。您可以(并且应该!)在声明时直接用一个值初始化它们。
  • 你是这个意思吗? Dim regKeyW7 As RegistryKey = Registry.LocalMachine.OpenSubKey("SOFTWARE\Wow6432Node\TeamViewer\Version7", True)
  • 是的,完全正确。事实上,如果您指定了Option Strict OnOption Infer On(无论如何这都是个好主意!),您可以省略As … 部分,使声明更加简洁。
  • @KonradRudolph 我发现它通常更令人困惑,而不是如果省略 As ... 部分会有所帮助;)
  • @Nicholas 为什么?我建议这是由于您的变量命名或软件设计(因为类型变得不透明),而不是由于遗漏了As …。此处提供的信息完全是多余的,只要变量命名正确。

标签: vb.net registry


【解决方案1】:

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

见:http://msdn.microsoft.com/en-us/library/windows/desktop/ms724072(v=vs.85).aspx

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

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

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

http://blogs.msdn.com/b/rmbyers/archive/2009/06/09/anycpu-exes-are-usually-more-trouble-then-they-re-worth.aspx

【讨论】:

    【解决方案2】:

    如果 teamviewer 得到一个不是 7 的新版本会发生什么?

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

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

    我安装了 teamviewer,但在注册表中没有安装目录

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-30
      • 1970-01-01
      • 2012-10-05
      相关资源
      最近更新 更多