Не получая обратные вызовы от Моста Доступа Java

Просто заключить в кавычки почти любой вид странной строки в Perl.

my $url = q{http://my.url.com/any/arbitrary/path/in/the/url.html};

На самом деле, различные механизмы заключения в кавычки в Perl довольно интересны. Perl подобные regex механизмы заключения в кавычки позволяет Вам заключать что-либо в кавычки, определяя разделители. Можно использовать почти любой специальный символ как #,/, или открыться/закрыть символы как (), [], или {}. Примеры:

my $var  = q#some string where the pound is the final escape.#;
my $var2 = q{A more pleasant way of escaping.};
my $var3 = q(Others prefer parens as the quote mechanism.);

механизмы Заключения в кавычки:

q: литеральная кавычка; только символ, которого нужно оставить, является конечным символом. qq: интерпретируемая кавычка; переменные процессов и символы ESC. Большой для строк, что необходимо заключить в кавычки:

my $var4 = qq{This "$mechanism" is broken.  Please inform "$user" at "$email" about it.};

qx: Работы как qq, но тогда выполняет его как системную команду, не в интерактивном режиме. Возвраты весь текст, сгенерированный из стандарта. (Перенаправление, если поддерживается в ОС, также выходит), Также сделанный с одинарными левыми кавычками ('символ).

my $output  = qx{type "$path"};      # get just the output
my $moreout = qx{type "$path" 2>&1}; # get stuff on stderr too

четверть: Интерпретирует как qq, но тогда компилирует его как регулярное выражение. Работы с различными вариантами на regex также. Можно теперь раздать regex как переменную:

sub MyRegexCheck {
    my ($string, $regex) = @_;
    if ($string)
    {
       return ($string =~ $regex);
    }
    return; # returns 'null' or 'empty' in every context
}

my $regex = qr{http://[\w]\.com/([\w]+/)+};
@results = MyRegexCheck(q{http://myurl.com/subpath1/subpath2/}, $regex);

QW: очень, очень полезный оператор кавычки. Поворачивается заключенный в кавычки набор пробела разделил слова на список. Большой для того, чтобы заполнить данные в модульном тесте.


   my @allowed = qw(A B C D E F G H I J K L M N O P Q R S T U V W X Y Z { });
   my @badwords = qw(WORD1 word2 word3 word4);
   my @numbers = qw(one two three four 5 six seven); # works with numbers too
   my @list = ('string with space', qw(eight nine), "a $var"); # works in other lists
   my $arrayref = [ qw(and it works in arrays too) ]; 

Они являются великими использовать их каждый раз, когда это делает вещи более ясными. Для qx, qq, и q, я, скорее всего, использую {} операторы. Наиболее распространенная привычка к людям, использующим QW, обычно () оператор, но иногда Вы также видите QW//.

7
задан Stevoisiak supports Monica 17 October 2017 в 18:27
поделиться

2 ответа

Я боролся и с этим. , и только что нашли решение, которое действительно имеет смысл. В итоге мне пришлось создать отладочную версию WindowsAccessBridge.dll и использовать отладчик, чтобы войти в нее и посмотреть, что происходит.

  • Вызов 'initializeAccessBridge' ТРЕБУЕТ, чтобы у вас был активный насос сообщений Windows.

Внутри 'initializeAccessBridge' он (в конечном итоге) создает скрытое диалоговое окно (используя CreateDialog). Как только диалог создан, он выполняет PostMessage с зарегистрированным сообщением. Сторона JavaVM моста доступа отвечает на это сообщение: и отправляет другое сообщение в созданный диалог (похоже, это рукопожатие типа «привет» между вашим приложением и виртуальной машиной Java). Таким образом, если ваше приложение не имеет активного насоса сообщений, ответное сообщение от JavaVM никогда не будет получено вашим приложением.

Это важно, поскольку до тех пор, пока это сообщение не будет получено, мост никогда не инициализируется должным образом, и поэтому все вызовы IsJavaWindow завершаются сбоем (внутренне мост инициализирует внутреннюю структуру после получения сообщения - как таковой, активных насос сообщений, без инициализации). Я предполагаю, что именно поэтому вы никогда не получаете сообщения обратного вызова.

Не только это, но вы должны вызвать initializeAccessBridge в точке, где насос сообщений может обрабатывать сообщения, прежде чем вы сможете вызвать IsJavaWindow.

Вот почему работают JavaFerret и JavaMonkey - они инициализируются при запуске, а затем перечисляют в ответ на сообщение меню, спустя много времени после того, как мост получил сообщение инициализации через насос сообщений.

Способ, которым я смог решить эту проблему в моем диалоговом приложении MFC (и в нашем приложении на основе MFC), заключался в том, чтобы убедиться, что вы вызываете 'initializeAccessBridge' в такой момент, чтобы встроенный насос сообщений MFC мог подтолкнуть Сообщение "привет" обратно в этот скрытый диалог ДО того, как вы его используете. В случае простого диалогового окна MFC это означало вызов initializeAccessBridge в OnInitDialog и вызов процедуры enum в ответ на вызов кнопки (например). Если вы хотите, чтобы перечисление происходило сразу после появления диалогового окна, вы можете использовать таймер для запуска (например, 10 мс) после завершения OnInitDialog, чтобы разрешить обработку сообщения инициализации.

Если вы планируете использовать это в консольном приложении, вам нужно будет написать свой собственный насос сообщений для обработки сообщения инициализации.

В любом случае, я надеюсь, что это достаточно ясно! Хотя невозможно узнать, является ли это «правильным» способом (кроме как заплатить инженеру Sun, чтобы он сказал нам), он определенно решил мою проблему.

Ура - Даррен.

о. и, кстати, я нашел неясную страницу Sun, в которой упоминалось что-то о AccessBridge, работающем только для Java-приложений на основе awt (но, учитывая, что Sun не обновляла документацию с 2004 года, это могло измениться). Я не программист на Java - для тестирования я взял несколько бесплатных приложений Java (а также те, которые поставлялись с jdk) и опробовал свое тестовое приложение. Это сработало для всех, которые я пробовал - YMMV. Удачи!

вам нужно будет написать свой собственный насос сообщений для обработки сообщения инициализации.

В любом случае, я надеюсь, что это достаточно ясно! Хотя невозможно узнать, является ли это «правильным» способом (кроме как заплатить инженеру Sun, чтобы он сказал нам), он определенно решил мою проблему.

Ура - Даррен.

о. и, кстати, я нашел неясную страницу Sun, в которой упоминалось что-то о AccessBridge, работающем только для Java-приложений на основе awt (но, учитывая, что Sun не обновляла документацию с 2004 года, это могло измениться). Я не программист на Java - для тестирования я взял несколько бесплатных приложений Java (а также те, которые поставлялись с jdk) и опробовал свое тестовое приложение. Это сработало для всех, которые я пробовал - YMMV. Удачи!

вам нужно будет написать свой собственный насос сообщений для обработки сообщения инициализации.

В любом случае, я надеюсь, что это достаточно ясно! Хотя невозможно узнать, является ли это «правильным» способом (кроме как заплатить инженеру Sun, чтобы он сказал нам), он определенно решил мою проблему.

Ура, Даррен.

о. и, кстати, я нашел неясную страницу Sun, в которой упоминалось что-то о AccessBridge, работающем только для Java-приложений на основе awt (но, учитывая, что Sun не обновляла документацию с 2004 года, это могло измениться). Я не программист на Java - для тестирования я взял несколько бесплатных приложений Java (а также те, которые поставлялись с jdk) и опробовал свое тестовое приложение. Это сработало для всех, которые я пробовал - YMMV. Удачи!

В любом случае, я надеюсь, что это достаточно ясно! Хотя невозможно узнать, является ли это «правильным» способом (кроме как заплатить инженеру Sun, чтобы он сказал нам), он определенно решил мою проблему.

Ура - Даррен.

о. и, кстати, я нашел неясную страницу Sun, в которой упоминалось что-то о AccessBridge, работающем только для Java-приложений на основе awt (но, учитывая, что Sun не обновляла документацию с 2004 года, это могло измениться). Я не программист на Java - для тестирования я взял несколько бесплатных приложений Java (а также те, которые поставлялись с jdk) и опробовал свое тестовое приложение. Это сработало для всех, которые я пробовал - YMMV. Удачи!

В любом случае, я надеюсь, что это достаточно ясно! Хотя невозможно узнать, является ли это «правильным» способом (кроме как заплатить инженеру Sun, чтобы он сказал нам), он определенно решил мою проблему.

Ура, Даррен.

о. и, кстати, я нашел неясную страницу Sun, в которой упоминалось что-то о AccessBridge, работающем только для Java-приложений на основе awt (но, учитывая, что Sun не обновляла документацию с 2004 года, это могло измениться). Я не программист на Java - для тестирования я взял несколько бесплатных приложений Java (а также те, которые поставлялись с jdk) и опробовал свое тестовое приложение. Это сработало для всех, которые я пробовал - YMMV. Удачи!

это определенно решило мою проблему.

Ура, Даррен.

о. и, кстати, я нашел неясную страницу Sun, в которой упоминалось что-то о AccessBridge, работающем только для Java-приложений на основе awt (но, учитывая, что Sun не обновляла документацию с 2004 года, это могло измениться). Я не программист на Java - для тестирования я взял несколько бесплатных приложений Java (а также те, которые поставлялись с jdk) и опробовал свое тестовое приложение. Это сработало для всех, которые я пробовал - YMMV. Удачи!

это определенно решило мою проблему.

Ура, Даррен.

о. и, кстати, я нашел неясную страницу Sun, в которой упоминалось что-то о AccessBridge, работающем только для Java-приложений на основе awt (но, учитывая, что Sun не обновляла документацию с 2004 года, это могло измениться). Я не программист на Java - для тестирования я взял несколько бесплатных приложений Java (а также те, которые поставлялись с jdk) и опробовал свое тестовое приложение. Это сработало для всех, которые я пробовал - YMMV. Удачи!

Я не java-программист - для тестирования я взял несколько бесплатных Java-приложений (а также те, которые поставлялись с jdk) и опробовал свое тестовое приложение. Это сработало для всех, которые я пробовал - YMMV. Удачи!

Я не java-программист - для тестирования я взял несколько бесплатных Java-приложений (а также те, которые поставлялись с jdk) и опробовал свое тестовое приложение. Это сработало для всех, которые я пробовал - YMMV. Удачи!

11
ответ дан 6 December 2019 в 23:11
поделиться

Вы уверены, что OnJavaShutdown () статичен? Я считаю, что объявление должно быть

static oid JavaAccess::OnJavaShutdown( long vmID )
0
ответ дан 6 December 2019 в 23:11
поделиться
Другие вопросы по тегам:

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