注册 登录
编程论坛 VFP论坛

MinibLink 如何接收 runJs运行后的返回值?

easyppt 发布于 2024-07-30 09:26, 695 次点击
MinibLink 如何接收 runJs运行后的返回值?

API文档地址:https://
帮助文档说:jsValue是个封装了内部v8各种类型的类。

我简单的写了3条语句,但结果不对,供参考:

lnResult = wkeRunJS(Thisform.SBG,jsString)
es = wkeGlobalExec(Thisform.SBG)
lctext = jsToTempString(es,lnResult)
10 回复
#2
吹水佬2024-07-30 14:05
有一个C的示例,或者可以参考一下。
C与JavaScript互相调用

C++调用JavaScript
和wke一样,wkexe也可以通过相同的wkeRunJS函数调用JavaScript代码,
但不同的是,如果C++代码想要获得JavaScript的返回值,需要在调用的JS代码前加上return:

jsRet = wkeRunJS(gWkeWebView, "return funcforcplusplus(\"\xe4\xbd\xa0\xe5\xa5\xbd ABCDEFG\")");
jsRetStr = jsToStringW(wkeGlobalExec(gWkeWebView), jsRet);
MessageBox(hWnd, jsRetStr, L"runJS返回", 0);

JavaScript调用C++
同wke一样,JS调用C++代码也需要绑定,在RunApplication函数中CreateWebWindow之前添加如下代码:

jsBindFunction("msgBox", js_msgBox, 2);//JS调用C++

同时在app.cpp文件中添加:

//JS调用C++
jsValue JS_CALL js_msgBox(jsExecState es)
{
    const wchar_t* text = jsToStringW(es, jsArg(es, 0));
    const wchar_t* title = jsToStringW(es, jsArg(es, 1));
    MessageBox(NULL, text, title, 0);
    return jsStringW(es, L"C++返回字符串");
}

前端测试用的HTML代码如下:

<!DOCTYPE html>
<html xmlns="http://www.
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>WKE Test Web Page</title>
<script>
function funcforcplusplus(instr){
    document.getElementById('result').value=instr;
    return navigator.userAgent;
    //return "JavaScript Return 返回啦";
}
</script>
</head>
<body>
<p>WKE Test Web Page</p>
<a href='#' onclick="document.getElementById('result').value=msgBox('TEST Function from JS to Cpp','来自Javascript的调用');">LINK</a>
<textarea rows='6' cols='36' id='result'>hello</textarea>
</body>
</html>


#3
easyppt2024-07-31 08:14
谢谢吹版,尝试转换为VFP代码,都没成功,感觉它返回的应该不是一个内存地址或者字符串常量,实在能力有限。

#4
iswith2024-07-31 10:53
问问作者不就可以啦,昨天还跟他聊着呢!!!
#5
吹水佬2024-08-01 20:52
以下是引用easyppt在2024-7-31 08:14:36的发言:

谢谢吹版,尝试转换为VFP代码,都没成功,感觉它返回的应该不是一个内存地址或者字符串常量,实在能力有限。

简单试了一下,是有点问题。
第一次获取的是空值,再次就是正常返回值。
只有本站会员才能查看附件,请 登录

只有本站会员才能查看附件,请 登录

程序代码:

函数声明
DECLARE LONG wkeRunJS      IN node LONG,STRING@
DECLARE LONG jsToString    IN node LONG,LONG
DECLARE LONG wkeGlobalExec IN node LONG


测试代码
    PROCEDURE test.click
        IF "" == this.Tag
            this.Tag = "1"
            wkeLoadFile(gWkeWebView, "test_js.html")
            RETURN
        ENDIF
        jsRet    = wkeRunJS(gWkeWebView, "return test()")
        jsRetStr = jsToString(wkeGlobalExec(gWkeWebView), jsRet)
        ret = SYS(2600,jsRetStr,32) && 长度要足够大
        ret = STRCONV(ret,11)
        ret = LEFT(ret, AT(0h00,ret)-1)
        MESSAGEBOX(ret)
    ENDPROC


前端测试用的HTML代码 test_js.html
<html>
<head>
<script>
function test()
{
    return "JavaScript Return 返回啦";
}   
</script>
</head>
<body>
<div class="demo1">
  <p>VFP调用JavaScript代码并获得JavaScript的返回值
</div>
</body>
</html>




#6
easyppt2024-08-01 21:34
吹版让我更加喜爱VFP

我测试了几次,返回还是空,难道是我的node.dll版本不对吗

这个 MinibLink 好像还有一个强大的功能,就是发送键盘鼠标动作,不知道利用这个函数能否实现自动填表。
现在网页大多都是VUE方式, document.getElementById 基本上都无法实现填表了。
我找找相关的函数,但实现估计还得指望吹版




[此贴子已经被作者于2024-8-1 21:56编辑过]

#7
iswith2024-08-02 21:29
VUE就不可以,document.getElementById不是吧。。。。。
#8
pnyjq2024-08-03 07:37
VUE控件不喜欢用ID
#9
pnyjq2024-08-03 07:38
人家本来就想灭掉dom的
#10
吹水佬2024-08-03 11:57
以下是引用easyppt在2024-8-1 21:34:02的发言:

吹版让我更加喜爱VFP

我测试了几次,返回还是空,难道是我的node.dll版本不对吗


很久没关注miniblink了,看了一下最新的是20231115,已经将node.dll和mb.dll合并为一个dll,初始化好像有点不同。
我测试用的是20220903版本,开始先调用一次jsToString()就可以获取正常返回值。
        jsRet = wkeRunJS(gWkeWebView, "return test()")
        es = wkeGlobalExec(gWkeWebView)
        jsToString(es, 0)
        jsRetStr = jsToString(es, jsRet)

[此贴子已经被作者于2024-8-3 11:58编辑过]

#11
iswith2024-08-03 13:33
试试108作者最近开发的!完整度性能都高一些,不过还是内存泄露严重,单进程,单线程模式,性能堪忧,
1