我有
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
好像没有定义?我需要在那里插入什么才能使其工作?
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;
}
}
);