Как запретить FTDI .NET DLL извещать пользователя, если драйверы не установлены - PullRequest
5 голосов
/ 11 марта 2011

У меня есть приложение на C #, которое использует FTD2XX.DLL от FTDI.Это приложение используется для нескольких поколений одного продукта и абстрагирует физическое оборудование.Существует FTDI и реализация HID.

Приложение ищет как подходящие устройства FTDI, так и HID, хотя вполне вероятно, что драйверы FTDI не существуют, если у пользователя есть поколение HID.

Теперь фон в стороне,Когда я создаю экземпляр класса FTDI, я получаю модальное, не сгенерированное моим кодом, информацию о том, что драйвер FTDI не найден, и спрашивает пользователя, установлены ли драйверы.Я попытался обернуть это в блок TRY / CATCH, но исключение не выдается.

1: Есть ли способ определить, установлены ли драйверы FTDI, прежде чем пытаться создать экземпляр класса FTDI?

2: Если нет, есть ли способ запретить FTDI dll предупреждать пользователя, когда это происходит?

Ответы [ 4 ]

4 голосов
/ 22 марта 2011

У меня точно такие же требования - в моем случае я перечисляю список стандартных последовательных портов и добавляю его в список всех подключенных устройств 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 голосов
/ 09 августа 2011

Другой способ:

[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);
}
0 голосов
/ 03 октября 2011

Я переписал библиотеку FTDI, которая вызвала ошибку: она была вызвана MessageBox.Show в конструкторе.Я заменил это на обычный бросок исключения.

См. Мой блог для переработанной оболочки и кода: подключение к FTDI-устройствам в Silverlight 5 RC

0 голосов
/ 09 августа 2011

Звучит так, как будто вы связываете FTD2XX.DLL с вашим приложением.

Вы не должны этого делать, вам следует использовать последнюю DLL, установленную в системный каталог Windows драйвером FTDI.Если у вас есть старая версия библиотеки DLL в каталоге приложения, а у пользователя есть новые драйверы (возможно, установленные на другом устройстве на основе FTDI), у вас могут возникнуть всевозможные проблемы.

В качестве бонуса,это решает вашу проблему в большинстве случаев: если FTD2XX.DLL не установлен в системе, вы получите исключение при попытке выполнить p / invoke, которое вы можете перехватить.

Однако, чтобы избежать ошибки совершенновам нужно будет сделать ту же проверку, что и FTD2XX.DLL для внутреннего использования (поскольку DLL, очевидно, может существовать в системе без какого-либо драйвера).Например, проверка того, указан ли драйвер в реестре под HKLM\System\CurrentControlSet\services, была бы более надежной проверкой, чем та, что у вас есть.Все еще не уверен, эквивалентен ли он собственному чеку FTDI.

...