Как обнаружить информацию браузера из модуля WebAssembly? - PullRequest
1 голос
/ 17 января 2020

Как инициировать переменную C ++ (скомпилированную в WebAssembly) из значения, обнаруженного через JavaScript при запуске (например, текущее screen.availWidth)?

Этот код необходимо инициировать из модуля WebAssembly, поэтому пользователь не может ввести значение, отличное от реального.

1 Ответ

1 голос
/ 28 февраля 2020

Объяснение

Вы можете запустить код JavaScript изнутри вашей функции C ++. Такой код JS имеет доступ ко всем объектам, к которым вы обычно имеете доступ при запуске его в веб-браузере. Для этого мы будем использовать макрос EM_ASM_INT , который выполняет код JS, возвращающий значение int.

Быстрое решение

Мы вводим код JS внутри Код C ++ example.cpp. Использование функции int main() гарантирует, что код будет автоматически выполняться при загрузке страницы без необходимости загрузки модуля WebAssembly вручную. Однако вы можете использовать другую функцию, экспортировать ее и выполнить на своей веб-странице.

#include <iostream>
#include <emscripten.h>

int main()
{
   int screen_width = EM_ASM_INT(
       return screen.availWidth;);
   std::cout << "Screen width=" << screen_width << std::endl;
}

Скомпилированный выше код example.cpp с помощью компилятора Emscripten выглядит следующим образом :

emcc example.cpp -o example.html

Вывод представляет собой веб-страницу со встроенной функцией int main() с кодом JS внутри (действительно, в начале). Чтобы выполнить код, допуская совместное использование ресурсов Cross-origin (CORS), мы будем использовать инструмент emrun (я не смог запустить пример на Firefox, поэтому вместо этого я использовал Chrome):

emrun --browser chrome example.html

Комментарий

Этот подход работает для JS кода с возвращаемым значением типа скаляр int (с использованием EM_ASM_INT), doubleEM_ASM_DOUBLE) , но также массив char* (с использованием EM_ASM_INT с тщательным и ручным управлением памятью, как показано здесь ).

...