我有一个带有嵌入式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) 大师我想了解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) 我有以下几乎用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) 我似乎无法弄清楚如何启动 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 行 …
我们想要为项目添加脚本.
我们在犹豫要使用哪个脚本引擎.我在过去的V8中使用它并且令人印象深刻.我也使用过Mono,但仅限于玩具项目或原型.
限制是:
哪种发动机最适合?
(是否有任何使用Visual Studio在win64下编译Mono的教程?是否有一些包含Lib文件和DLL的软件包?)
我想在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++包装器,但我对这个问题的想法已经不多了:)
我在Windows桌面C ++应用程序中使用了嵌入式V8引擎。我知道V8支持ES6模块。我将如何在应用程序中激活和使用此功能?
我不希望任何人都能找到一个完整的例子说明该工作原理,但是向我(和未来的读者)指出正确方向的高水平答案将完全满足我对这个问题的希望和期望。
我试图了解 v8 是如何工作的,但我无法找到代码中的位置,它实际上获取输入原始 js 脚本来解析它并将其编译为 C++。
\n我看过 api.cc 并尝试在编译器函数中设置断点,但没有运气(我使用 chromium 来这样做),它永远不会命中这个函数。
\nMaybeLocal<Script> ScriptCompiler::Compile(Local<Context> context,\n Source* source,\n CompileOptions options,\n NoCacheReason no_cache_reason)\n\nRun Code Online (Sandbox Code Playgroud)\n***** 更新 ****
\n在 @jmrk 回复之后,我一直在试图弄清楚 JS 实际上是从哪里开始进来的,我真正感兴趣的是了解网站如何呈现,然后将脚本传递到 V8 中进行编译。\n我发现有关该主题的大量信息,但我仍然无法理解整个情况:
\n结果第一步不是解析器而是扫描器,它获取 UTF-16 流作为输入。
\n\n\n源代码首先被分成块;每个块可能与不同的编码相关联。然后,流将所有块统一为 UTF-16 编码。
\n在解析之前,扫描器会将 UTF-16 流分解为令牌。标记是具有语义的脚本的最小单元。标记有多种类别,包括空格\n(用于自动分号插入)、标识符、关键字和代理对(仅当该对不被识别为其他内容时才组合起来形成标识符)。然后,这些标记首先被馈送到预解析器,然后再馈送到解析器。
\n
https://blog.logrocket.com/how-javascript-works-optimizing-for-parsing-efficiency/
\n我还发现它确实从 Blink 获取了这个流:
\n\n\n\n\nUTF16CharacterStream 提供了 V8 从 Chrome 接收的底层 Latin1、UTF-8 或 UTF-16 编码的(可能是缓冲的)UTF-16 视图,而 Chrome 又从网络接收这些编码。除了支持多种编码之外,扫描仪和字符流之间的分离允许 V8 透明地扫描,就好像整个源都可用一样,即使到目前为止我们可能只通过网络收到了一部分数据。
\n
扫描仪似乎也将标记提供给解析器:
\n\nV8\xe2\x80\x99s …
我已经为 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 没有建立。如果可能的话,我宁愿启用它。
我现在正在试验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 开发人员的指导,如何使用他们旧的元构建系统 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++ 编译器进行构建?
我尝试为我的 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) 我想要做的是从 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 来说似乎已经过时。
embedded-v8 ×13
v8 ×12
c++ ×8
javascript ×3
blink ×1
chromium ×1
es6-modules ×1
html5-canvas ×1
libv8 ×1
mono ×1
node.js ×1
scope ×1
webassembly ×1