如何编写在 TEdgeBrowser ExecuteScript 之后执行的 lambda 函数?

问题描述 投票:0回答:1

我有

TEdgeBrowser
并且我正在使用
ExecuteScript
中的
DefaultInterface
方法,如下所示:

EdgeBrowser1->DefaultInterface->ExecuteScript()

ExecuteScript
,当以这种方式调用时需要2个参数:

System::WideChar * javaScript
const _di_ICoreWebView2ExecuteScriptCompletedHandler handler

我想写的是一个 lambda 函数(使用 clang 编译器),它在脚本执行后执行(并销毁)...

类似:

    EdgeBrowser1->DefaultInterface->(L"alert('Hello World!')",
        _di_ICoreWebView2ExecuteScriptCompletedHandler(
            new TCppInterfacedObject<TCoreWebView2ExecuteScriptCompletedHandler>(
                [](HRESULT errorCode, PCWSTR resultObjectAsJson) -> HRESULT {
                    if (FAILED(errorCode))
                    {
                        ShowMessage("Failed to execute script");
                        return errorCode;
                    }
                    ShowMessage("Script executed successfully");
                    return S_OK;
                })));

但是,

TCoreWebView2ExecuteScriptCompletedHandler
好像没有定义?我需要在那里插入什么才能使其工作?

c++builder tedgebrowser
1个回答
0
投票

TEdgeBrowser::DefaultInterface
属性是 Microsoft 提供的原始
ICoreWebView2*
接口指针,只是包装在
DelphiInterface
类中(这就是
_di_
前缀所指的内容)。 Microsoft 没有
_di_
包装类型的概念。
ExecuteScript()
的参数实际上是
LPCWSTR
(又名
const wchar_t*
)和
ICoreWebView2ExecuteScriptCompletedHandler*

但是,即使第二个参数在某种程度上是

_di_
类型,您也无法在需要接口的地方传递 lambda。您需要编写一个实现
ICoreWebView2ExecuteScriptCompletedHandler
接口的类,然后将该类的对象实例传递给
ExecuteScript()
。您尝试使用
TCppInterfacedObject
来实现此目的的方式是不正确的。

试试这个:

class TCoreWebView2ExecuteScriptCompletedHandler : public TCppInterfacedObject<ICoreWebView2ExecuteScriptCompletedHandler>
{
public:
    INTFOBJECT_IMPL_IUNKNOWN(TInterfacedObject);

    HRESULT Invoke(HRESULT errorCode, LPCWSTR resultObjectAsJson)
    {
        if (FAILED(errorCode))
        {
            ShowMessage("Failed to execute script");
            return errorCode;
        }
        ShowMessage("Script executed successfully");
        return S_OK;
    }
};

EdgeBrowser1->DefaultInterface->ExecuteScript(
    L"alert('Hello World!')",
    new TCoreWebView2ExecuteScriptCompletedHandler()
);

如果你真的想使用 lambda,那么你需要更多类似这样的东西:

#include <functional>

class TCoreWebView2ExecuteScriptCompletedHandler : public TCppInterfacedObject<ICoreWebView2ExecuteScriptCompletedHandler>
{
public:
    INTFOBJECT_IMPL_IUNKNOWN(TInterfacedObject);

    using funcType = std::function<HRESULT(HRESULT, LPCWSTR)>;

    TCoreWebView2ExecuteScriptCompletedHandler(funcType func) : m_func(func) {}

    HRESULT Invoke(HRESULT errorCode, LPCWSTR resultObjectAsJson)
    {
        return m_func(errorCode, resultObjectAsJson);
    }

private:
    funcType m_func;
};

EdgeBrowser1->DefaultInterface->ExecuteScript(
    L"alert('Hello World!')",
    new TCoreWebView2ExecuteScriptCompletedHandler(
        [](HRESULT errorCode, LPCWSTR resultObjectAsJson) -> HRESULT
        {
            if (FAILED(errorCode))
            {
                ShowMessage("Failed to execute script");
                return errorCode;
            }
            ShowMessage("Script executed successfully");
            return S_OK;
        }
    }
);

或者:

template<typename FuncType>
class TCoreWebView2ExecuteScriptCompletedHandler : public TCppInterfacedObject<ICoreWebView2ExecuteScriptCompletedHandler>
{
public:
    INTFOBJECT_IMPL_IUNKNOWN(TInterfacedObject);

    TCoreWebView2ExecuteScriptCompletedHandler(FuncType func) : m_func(func) {}

    HRESULT Invoke(HRESULT errorCode, LPCWSTR resultObjectAsJson)
    {
        return m_func(errorCode, resultObjectAsJson);
    }

private:
    FuncType m_func;
};

EdgeBrowser1->DefaultInterface->ExecuteScript(
    L"alert('Hello World!')",
    new TCoreWebView2ExecuteScriptCompletedHandler<HRESULT(HRESULT, LPCWSTR)>(
        [](HRESULT errorCode, LPCWSTR resultObjectAsJson) -> HRESULT
        {
            if (FAILED(errorCode))
            {
                ShowMessage("Failed to execute script");
                return errorCode;
            }
            ShowMessage("Script executed successfully");
            return S_OK;
        }
    }
);
© www.soinside.com 2019 - 2024. All rights reserved.