Обработка обратных вызовов в классах Дарт

Начиная с Windows 8.1, GetVersion() и GetVersionEx() подлежат проявлению приложения:

С выпуском Windows 8.1, поведение API GetVersionEx изменилось в значении, которое оно вернет для версии операционной системы. Значение, возвращаемое функцией GetVersionEx, теперь зависит от того, как проявляется приложение.

Приложения, которые не отображаются для Windows 8.1 или Windows 10, вернут значение версии ОС Windows 8 (6.2). Когда приложение проявляется для данной версии операционной системы, GetVersionEx всегда будет возвращать версию, в которой приложение проявляется в будущих выпусках. Чтобы продемонстрировать свои приложения для Windows 8.1 или Windows 10, см. Ориентация вашего приложения на Windows .

blockquote>

Новые функции Version Helper просто обертки для VerifyVersionInfo() . Начиная с Windows 10, он также подвержен манифестации:

Windows 10: VerifyVersionInfo возвращает false при вызове приложениями, которые не имеют манифест совместимости для Windows 8.1 или Windows 10, если параметр lpVersionInfo установлен так, чтобы он указывал Windows 8.1 или Windows 10, даже если текущая версия операционной системы - Windows 8.1 или Windows 10. В частности, VerifyVersionInfo имеет следующее поведение:

  • Если приложение не имеет манифеста, VerifyVersionInfo ведет себя так, как если бы операционная система была версией Windows 8 (6.2).
  • Если приложение имеет манифест, содержащий GUID, соответствующий Windows 8.1, VerifyVersionInfo ведет себя так, как если бы операционная система была версией Windows 8.1 (6.3).
  • Если приложение имеет манифест, содержащий GUID, соответствующий Windows 10, VerifyVersionInfo ведет себя так, как если бы операционная система была Windows 10 (10.0).

Функции Version Helper используют функцию VerifyVersionInfo, поэтому поведение IsWindows8Point1OrGreater и IsWindows10OrGreater также подвержены влиянию присутствия и содержимого манифеста.

Чтобы продемонстрировать свои приложения для Windows 8.1 или Windows 10, см. Ориентация на приложение для Windows .

blockquote>

Чтобы получить истинную версию ОС независимо от ее проявления, Microsoft предлагает запросить версию файла системной DLL:

Получение системы Версия

Чтобы получить полный номер версии для операционной системы, вызовите функцию GetFileVersionInfo в одной из системных DLL, например Kernel32.dll, затем вызовите VerQueryValue для получения подблока \\StringFileInfo\\\\ProductVersion информации о версии файла.

blockquote>

Другой способ - использовать RtlGetVersion() , NetServerGetInfo() , или NetWkstaGetInfo() . Они все сообщают точную версию ОС и не подлежат манифестации (пока?).

0
задан Hexer 10 13 July 2018 в 22:58
поделиться

1 ответ

Прежде всего, вы не знаете точно, что весь ответ на вашу отправку поступает в один пакет, поэтому у вас может не быть всего ответа. Предположим, что вы это сделаете (иначе вам нужно будет сделать больше обработки в dataHandler, чтобы собрать ответ до его доставки).

Канонический способ разрешить обратный вызов, когда что-то произошло в будущее, должно вернуть Future. Вам также понадобится способ завершить это будущее, поэтому вы создадите Completer и сохраните его, пока он вам не понадобится. Поскольку вы, вероятно, можете делать больше сообщений, вам нужно помнить более одного дополнения. Итак, в целом, я бы написал это как:

Queue<Completer<String>> _queue = Queue();

Future<String> send(String cmd){
    socket.writeln(cmd);
    var completer = new Completer<String>();
    _queue.add(completer);
    return completer.future;
}

void _dataHandler(data){
    var reply = new String.fromCharCodes(data).trim();
    // Add some sanity checking here. Make sure you have the entire response before
    // executing the code below.
    _queue.removeFirst().complete(reply);
}

(я сделал _dataHandler приватным, потому что вы, вероятно, не хотите, чтобы пользователь, вызывающий send, мог позвонить dataHandler). [/ д2]

1
ответ дан lrn 17 August 2018 в 12:06
поделиться
  • 1
    Спасибо за ответ, но он дает мне эту ошибку: Unhandled exception: Bad state: No element #0 ListQueue.removeFirst (dart:collection/queue.dart:793:25) #1 TeamSpeak3._dataHandler (file:///D:/Documents/PhpstormProjects/TS3Bot/lib/ts3.dart:67:16) – Hexer 10 14 July 2018 в 08:04
  • 2
    Действительно после отладки: if (_queue.isEmpty){print("Empty") } показывает, что он пуст – Hexer 10 14 July 2018 в 08:24
  • 3
    nvm Я решил, что проблема заключается в том, что подключение для запуска ответа с сервера. – Hexer 10 14 July 2018 в 08:37
  • 4
    Привет, снова, у меня возникла проблема с вызовом функции, которая вызовет ответ другого сервера внутри обработчика данных, то есть: клиент отправит боту !help, боту следует ответить с помощью I'm here to help you. Но поведение это так: если я вызываю другую функцию внутри вызова (чтобы получить больше информации о клиенте), первый ответ застревает, второй отправляет ответ дважды, а третий - в порядке. Полный исходный код: github.com/Hexer10/TeamSpeak3-Library/blob/master/bin/… – Hexer 10 16 July 2018 в 12:34
Другие вопросы по тегам:

Похожие вопросы: