标签: embedded-v8

从不调用C++ Console app,SetWindowsHookEx,Callback

我有一个带有嵌入式v8引擎的小型控制台应用程序,我想添加一个钩子来注册关键事件.这在我使用Qt和QtScript之前都有效,但是我将它全部移植到VC++ 2008中的直接C++.应用程序编译并运行,但钩子永远不会被调用,这里是相关的代码:

在主()

HWND hwndC = GetConsoleWindow() ;
    HINSTANCE hInst = (HINSTANCE)GetWindowLong( hwndC, GWL_HINSTANCE );
    if (SetWindowsHookEx(WH_KEYBOARD_LL, HookProc, hInst, NULL) == 0) {
        printf("Failed to set hook\n");
    } else {
        printf("Hook established\n");
    }
    g->RunScript(argc,argv);
Run Code Online (Sandbox Code Playgroud)

过程:

LRESULT CALLBACK HookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    printf("HookProc called\n");
    PKBDLLHOOKSTRUCT p = (PKBDLLHOOKSTRUCT) (lParam);
    if (wParam == WM_KEYDOWN) {
       keyDown(p,g);
    } else if (wParam == WM_KEYUP) {
        keyUp(p,g);
    }
    fflush(stdout);
    return CallNextHookEx(NULL, nCode, wParam, lParam);
}
Run Code Online (Sandbox Code Playgroud)

这实际上是对v8示例代码中shell.cc的扩展.我想知道它是否以某种方式阻止?我承认我不知道我在这里做什么,只是在玩耍和学习,但这个让我感到难过.

在keyDown里面说,我有这样的事情:

    v8::Handle<v8::String> callback_name = v8::String::New("onKeyDown");
    v8::Handle<v8::Value> …
Run Code Online (Sandbox Code Playgroud)

c++ keyboard-events embedded-v8

4
推荐指数
1
解决办法
2815
查看次数

JavaScript 如何在 Google V8 特别是 Canvas 相关代码中执行

大师我想了解Google-V8引擎的工作原理,据我所知,我浏览了https://developers.google.com/v8/get_started,V8将javascript作为输入,然后编译它并获得输出,如上面的示例所示,我们将其作为字符串输出。在现实生活中,情况有所不同,考虑这个画布代码

var canvas = document.getElementById("canvas"),
        ctx = canvas.getContext("2d"), // Create canvas context
        W = window.innerWidth, // Window's width
        H = window.innerHeight, // Window's height
        particles = [], // Array containing particles
        ball = {}, // Ball object
        paddles = [2], // Array containing two paddles
        mouse = {}, // Mouse object to store it's current position
        points = 0, // Varialbe to store points
        fps = 60, // Max FPS (frames per second)
        particlesCount = 20, // Number …
Run Code Online (Sandbox Code Playgroud)

javascript v8 embedded-v8 html5-canvas

4
推荐指数
1
解决办法
953
查看次数

C++范围和Google V8脚本上下文

我有以下几乎用c ++编写的代码片段:

[..]

Handle<Object> jsGlobal;
Handle<Function> jsUpdateFunc;

void setupJs () {
    V8::Initialize();
    Isolate* isolate = v8::Isolate::New();
    Isolate::Scope isolate_scope(isolate);
    HandleScope handle_scope(isolate);
    Local<Context> context = Context::New(isolate);
    Context::Scope context_scope(context);
    Local<String> source = String::NewFromUtf8(isolate, "var a = 0; function test() { a++; return a.toString(); }");
    Local<Script> script = Script::Compile(source);
    script->Run();

    jsGlobal = context->Global();
    Handle<Value> value = jsGlobal->Get(String::NewFromUtf8(isolate, "test"));
    jsUpdateFunc = Handle<Function>::Cast(value);
}

void callJs() {
    Handle<Value> args[0];
    Handle<Value> js_result = jsUpdateFunc->Call(jsGlobal, 0, args);
    js_result->ToString();

    String::Utf8Value utf8(js_result);
    printf("%s\n", *utf8);
}

[..]
Run Code Online (Sandbox Code Playgroud)

我有函数setupJs()设置v8环境,callJs应该被多次调用(工作时,javascript脚本每次增加一个var).

如果我放

Handle<Value> args[0]; …
Run Code Online (Sandbox Code Playgroud)

c++ scope v8 embedded-v8 libv8

4
推荐指数
1
解决办法
1850
查看次数

调用 Isolate::New() 后执行位置 0x0000000000000000 时发生访问冲突

我似乎无法弄清楚如何启动 V8。我有这个代码:

if (!_V8Initialized)
{
    v8::V8::InitializeICU();

    v8::V8::InitializeExternalStartupData("x86\\"); // (this loads ok, I checked)

    auto platform = v8::platform::CreateDefaultPlatform();
    v8::V8::InitializePlatform(platform);

    v8::V8::Initialize();

    _V8Initialized = true;
}

auto params = Isolate::CreateParams();
params.array_buffer_allocator = ArrayBuffer::Allocator::NewDefaultAllocator();
_Isolate = Isolate::New(params);
Run Code Online (Sandbox Code Playgroud)

但我收到这个错误:

V8.Net.Console.exe 中的 0x0000000000000000 处抛出异常:0xC0000005:执行位置 0x0000000000000000 时发生访问冲突。

v8_libbase.dll!v8::base::OS::Abort() 第 832 行 C++ v8_libbase.dll!V8_Fatal(const char * file, int line, const char * format, ...) 第 74 行 C++ v8.dll!v8 ::internal::SnapshotData::SnapshotData(const v8::internal::Vector snapshot) 第 28 行 C++ v8.dll!v8::internal::Snapshot::Initialize(v8::internal::Isolate *isolate) 第 43 行C++ v8.dll!v8::Isolate::New(const v8::Isolate::CreateParams & params) 第 8237 行 …

c++ v8 embedded-v8

4
推荐指数
1
解决办法
2908
查看次数

嵌入Mono vs Google V8?

我们想要为项目添加脚本.

我们在犹豫要使用哪个脚本引擎.我在过去的V8中使用它并且令人印象深刻.我也使用过Mono,但仅限于玩具项目或原型.

限制是:

  1. 执行速度.
  2. 易于集成.
  3. 必须在窗户上工作.
  4. 64位支持.
  5. 在Visual Studio下编译.

哪种发动机最适合?

(是否有任何使用Visual Studio在win64下编译Mono的教程?是否有一些包含Lib文件和DLL的软件包?)

c++ mono v8 embedded-language embedded-v8

3
推荐指数
1
解决办法
3628
查看次数

如何迭代Object中的属性

我想在V8 C++函数中迭代一个Object.

的NodeJS:

node.addProperties({"user":"testuser","password":"passwd"};
Run Code Online (Sandbox Code Playgroud)

我想将"user"和"password",名称和值都传递给C++方法,该方法采用如下参数:

AddProperty(char * name, char * value);
Run Code Online (Sandbox Code Playgroud)

名称/值对的数量可能不同,因此我需要一个通用的解决方案.

我可以得到一些帮助,以便走上正轨.

我一直在为Node和V8编写更简单的C++包装器,但我对这个问题的想法已经不多了:)

c++ v8 node.js embedded-v8

3
推荐指数
1
解决办法
2568
查看次数

如何在V8 JavaScript引擎中启用和使用ES6模块?

我在Windows桌面C ++应用程序中使用了嵌入式V8引擎。我知道V8支持ES6模块。我将如何在应用程序中激活和使用此功能?

我不希望任何人都能找到一个完整的例子说明该工作原理,但是向我(和未来的读者)指出正确方向的高水平答案将完全满足我对这个问题的希望和期望。

v8 embedded-v8 es6-modules

3
推荐指数
1
解决办法
1149
查看次数

V8 实际上在哪里使用原始 javascript 代码?

我试图了解 v8 是如何工作的,但我无法找到代码中的位置,它实际上获取输入原始 js 脚本来解析它并将其编译为 C++。

\n

我看过 api.cc 并尝试在编译器函数中设置断点,但没有运气(我使用 chromium 来这样做),它永远不会命中这个函数。

\n
MaybeLocal<Script> ScriptCompiler::Compile(Local<Context> context,\n                                      Source* source,\n                                      CompileOptions options,\n                                      NoCacheReason no_cache_reason)\n\n
Run Code Online (Sandbox Code Playgroud)\n

***** 更新 ****

\n

在 @jmrk 回复之后,我一直在试图弄清楚 JS 实际上是从哪里开始进来的,我真正感兴趣的是了解网站如何呈现,然后将脚本传递到 V8 中进行编译。\n我发现有关该主题的大量信息,但我仍然无法理解整个情况:

\n

结果第一步不是解析器而是扫描器,它获取 UTF-16 流作为输入。

\n
\n

源代码首先被分成块;每个块可能与不同的编码相关联。然后,流将所有块统一为 UTF-16 编码。

\n

在解析之前,扫描器会将 UTF-16 流分解为令牌。标记是具有语义的脚本的最小单元。标记有多种类别,包括空格\n(用于自动分号插入)、标识符、关键字和代理对(仅当该对不被识别为其他内容时才组合起来形成标识符)。然后,这些标记首先被馈送到预解析器,然后再馈送到解析器。

\n
\n

https://blog.logrocket.com/how-javascript-works-optimizing-for-parsing-efficiency/

\n

我还发现它确实从 Blink 获取了这个流:

\n

在此输入图像描述

\n
\n

UTF16CharacterStream 提供了 V8 从 Chrome 接收的底层 Latin1、UTF-8 或 UTF-16 编码的(可能是缓冲的)UTF-16 视图,而 Chrome 又从网络接收这些编码。除了支持多种编码之外,扫描仪和字符流之间的分离允许 V8 透明地扫描,就好像整个源都可用一样,即使到目前为止我们可能只通过网络收到了一部分数据。

\n
\n

https://v8.dev/blog/scanner

\n

扫描仪似乎也将标记提供给解析器:

\n
\n

V8\xe2\x80\x99s …

javascript v8 blink chromium embedded-v8

3
推荐指数
1
解决办法
478
查看次数

嵌入器侧指针压缩已禁用

我已经为 Windows 构建了 v8 8.4 作为一个整体静态库,并且正在尝试使用 Visual Studio 2019 运行这个示例项目。

项目运行时我得到的错误是这样的:

# Fatal error in ../../src/api/api.cc, line 5619
# Embedder-vs-V8 build configuration mismatch. On embedder side pointer compression is DISABLED while on V8 side it's ENABLED.
Run Code Online (Sandbox Code Playgroud)

我试过用v8_enable_pointer_compressionset to重建 v8 false,但 v8 没有建立。如果可能的话,我宁愿启用它。

c++ v8 embedded-v8

3
推荐指数
1
解决办法
724
查看次数

在V8中使用TerminateExecution

我现在正在试验V8.我希望能够在一个线程中运行一些(可能是长时间运行的)javascript,然后能够从另一个线程"优雅地"终止执行.

我写了这个简单的片段来测试Lockers的概念和TerminateExecution的用法:

void breaker( Isolate* isolate, int tid ) {

    getchar();      //wait for keyboard input on stdin

    std::cout << "Breaking V8 execution" << std::endl;

    v8::Locker locker( isolate );       //lock the isolate
    v8::V8::TerminateExecution( tid );  //and terminate it
}

int main( int argc, char **argv ) {

    if( argc != 2 ) {
        std::cout << "No script name given" << std::endl;
        return 1;
    }

    Isolate* isolate = Isolate::New();              //create a new isolate
    Isolate::Scope isolateScope( isolate );         //enter it

    v8::Locker locker( isolate …
Run Code Online (Sandbox Code Playgroud)

v8 embedded-v8

1
推荐指数
1
解决办法
1299
查看次数

是否可以使用 Microsoft VC++ 编译器构建 Google V8 引擎?

不久前,我使用了 V8 开发人员的指导,如何使用他们旧的元构建系统 GYP 和 Microsoft VC++ 编译器(来自 Visual Studio)构建 V8。这非常简单:使用 GYP 生成 .sln 文件,使用 Microsoft VC++ 编译器构建它。不幸的是,这条指令不再可用,因为 Google 转向了另一个元构建系统(称为 GN)并放弃了 GYP。

这并不是真正的问题,因为 GN 也可以创建 sln 文件 - 但是,据我了解,他们不再支持 Microsoft 编译器。他们发布并使用 clang 在 Windows 上构建 V8(即使您从 Visual Studio 构建它)。

所以,我的问题是:当前的 V8 代码主干是否可以创建 sln 文件,该文件可以在 Visual Studio(假设是 2017)中打开,并且可以使用 Microsoft C++ 编译器进行构建?

v8 embedded-v8

1
推荐指数
1
解决办法
1824
查看次数

WebAssembly.instantiate 既没有调用,也没有在 v8 嵌入中捕获

我尝试为我的 Android 项目提供 WebAssembly 功能v8 7.2。我已成功导入v8为静态库。但我遇到了一个问题,WebAssembly 既没有调用then也没有catch回调。下面是我的代码:

std::unique_ptr<v8::Platform> platform;
v8::Isolate *isolate;
v8::Persistent<v8::Context> persistentContext;
void runMain();
void runScript();
void _log(const v8::FunctionCallbackInfo<v8::Value>& info) {
  v8::String::Utf8Value utf(isolate, info[0].As<v8::String>());
  __android_log_print(ANDROID_LOG_DEBUG, "V8Native", "%s",*utf);
}

void JNICALL
Java_com_hustunique_v8demoapplication_MainActivity_initV8(JNIEnv *env, jobject /* this */) {
  // Initialize V8.
  v8::V8::InitializeICU();
  platform = v8::platform::NewDefaultPlatform();
  v8::V8::InitializePlatform(&(*platform.get()));
  v8::V8::Initialize();
  runMain();
}

void runMain() {
  // Create a new Isolate and make it the current one.

  v8::Isolate::CreateParams create_params;
  create_params.array_buffer_allocator = v8::ArrayBuffer::Allocator::NewDefaultAllocator();
  isolate = v8::Isolate::New(create_params);
// …
Run Code Online (Sandbox Code Playgroud)

javascript c++ v8 embedded-v8 webassembly

1
推荐指数
1
解决办法
915
查看次数

从 C++ 调用 v8 中的 JS 函数

我想要做的是从 C++ 调用 JS/v8 中已编译的函数。我正在为我正在编写的使用 V8 作为脚本后端的游戏引擎执行此操作。

这就是为我的引擎格式化脚本的方式:

function init(){ //this gets called at the startup of the game
    print("wambo");
}

var time = 0;
function tick(delta){ //this gets called every frame
    time += delta;
    print("pop");
}
Run Code Online (Sandbox Code Playgroud)

我尝试通过此编译文档https://v8docs.nodesource.com/node-16.13/df/d69/classv8_1_1_context.html查看v8::Local<v8::Context>->Global中获取函数的函数按名称,来自编译的 JS,但无法理解密钥系统。

我尝试阅读使用参数从 C++ 调用 v8 javascript 函数,但这些示例对于 2022 年最新版本的 v8 来说似乎已经过时。

c++ v8 embedded-v8

0
推荐指数
1
解决办法
1198
查看次数