【问题标题】:How to prohibit FTDI .NET DLL from alerting user when drivers are not installed如何在未安装驱动程序时禁止 FTDI .NET DLL 提醒用户
【发布时间】:2011-03-11 17:43:44
【问题描述】:

我有一个使用 FTDI 的 FTD2XX.DLL 的 C# 应用程序。此应用程序用于单个产品的多代并抽象物理硬件。有一个 FTDI 和一个 HID 实现。

应用程序会搜索适当的 FTDI 和 HID 设备,但如果用户生成了 HID,则可能不存在 FTDI 驱动程序。

现在抛开背景。当我实例化 FTDI 类时,我得到一个模态,不是由我的代码生成的关于找不到 FTDI 驱动程序并询问用户是否安装了驱动程序。我尝试将其包装在 TRY/CATCH 块中,但未引发异常。

1:有没有办法在尝试实例化 FTDI 类之前确定是否安装了 FTDI 驱动程序?

2:如果没有,有没有办法禁止 FTDI dll 在发生这种情况时提醒用户?

【问题讨论】:

  • @user99065 - 只需要求您的应用程序安装其中一个驱动程序即可。除非您说即使使用其他驱动程序,您仍然会收到错误消息,否则无法找到其他驱动程序。我只会检查将要安装的驱动程序,它应该足够简单,使用配置文件。
  • Ramhound,用户不知道他们拥有哪一代硬件,并且同一应用程序应该能够在同一台 PC 上与多代一起使用,而用户对此一无所知。使用 HID 的原因是为了避免安装 FTDI 驱动程序,因为我可以使用通用 HID 接口。不过感谢您的想法。

标签: c# .net windows driver


【解决方案1】:

我有完全相同的要求——在我的例子中,我列举了标准串行端口的列表并将其附加到任何附加的 FTDI 设备的列表中。如果未安装驱动程序,那么我不想出现那些模式对话框。 我想出的一种快速而肮脏的方法是检查文件 FTD2XX.DLL 是否位于 c:\windows\system32 (或安装 Windows 的任何位置)中。这个文件的存在基本上说明驱动已经安装好了。

// c# example
string path = Environment.GetFolderPath(Environment.SpecialFolder.System);
bool installed = File.Exists(path + Path.DirectorySeparatorChar + "FTD2XX.DLL");

【讨论】:

    【解决方案2】:

    另一种方式:

    [DllImport("kernel32.dll")]
    private static extern IntPtr LoadLibrary(string dllToLoad);
    [DllImport("kernel32.dll")]
    private static extern bool FreeLibrary(IntPtr hModule);    
    
    public bool IsDriverInstalled()
    {
      //trying to load library
      IntPtr handler = LoadLibrary(@"FTD2XX.DLL");
    
      if (handler == IntPtr.Zero)
          return false;
      else
          return true; // Driver is installed
    
      //Don't forget to free .dll
      FreeLibrary(handler);
    }
    

    【讨论】:

    • 是那个DLL生成的对话框,所以很明显这个DLL是在讨论的案例中找到的。
    • 这是 FTD2XX_NET.DLL 进行检查的方式(并且 FTD2XX_NET.DLL 也会生成消息框)。
    【解决方案3】:

    听起来好像您正在将 FTD2XX.DLL 与您的应用程序捆绑在一起。

    您不应该这样做,您应该使用由 FTDI 驱动程序安装到 Windows 系统目录中的最新 DLL。如果您的应用目录中有旧版本的 DLL,而用户有更新的驱动程序(可能由其他基于 FTDI 的设备安装),您可能会遇到各种麻烦。

    另外,这在大多数情况下解决了您的问题:如果系统上未安装 FTD2XX.DLL,您将在尝试 p/invoke 时遇到异常,您可以捕获该异常。

    然而,为了完全避免错误,您需要执行与 FTD2XX.DLL 内部相同的检查(因为 DLL 显然可以在没有任何驱动程序的情况下存在于系统中)。例如,检查驱动程序是否列在HKLM\System\CurrentControlSet\services 下的注册表中将是比您拥有的更强大的检查。仍然不确定它是否等同于 FTDI 自己的支票。

    【讨论】:

      【解决方案4】:

      我重写了导致错误的 FTDI 库:它是由构造函数中的 MessageBox.Show 引起的。我已将其替换为正常的异常抛出。

      有关重新设计的包装器和代码,请参阅我的博客: connecting to FTDI devices in Silverlight 5 RC

      【讨论】:

        猜你喜欢
        • 2014-10-12
        • 1970-01-01
        • 1970-01-01
        • 2011-04-24
        • 1970-01-01
        • 2012-09-27
        • 2016-06-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多