Convenciones de la API de C++ de WebView2 Win32

Métodos asincrónicos

Métodos asincrónicos en la API C++ de WebView2 Win32 use una interfaz de delegado para devoluciones de llamada para indicar cuándo se ha completado el método asincrónico, el código de éxito o el error, y para algunos, el resultado del método asincrónico. El último parámetro de todos los métodos asincrónicos es un puntero a una interfaz de delegado de la que se proporciona una implementación.

La interfaz Delegate tiene un único Invoke método que toma como primer parámetro un HRESULT código de éxito o error. Además, es posible que haya un segundo parámetro que sea el resultado del método si el método tiene un resultado. Por ejemplo, el método ICoreWebView2:: CapturePreview toma como parámetro final un ICoreWebView2CapturePreviewCompletedHandler puntero. Para enviar una CapturePreview solicitud de método, se proporciona una instancia del ICoreWebView2CapturePreviewCompletedHandler puntero que se implementa. El siguiente fragmento de código usa un método para implementar.

HRESULT Invoke(HRESULT result)

Implemente el Invoke método y CoreWebView2 solicite el Invoke método cuando se CapturePreview complete la solicitud. El único parámetro es el que HRESULT describe el código de éxito o error de la CapturePreview solicitud.

O para ICoreWebView2::ExecuteScript , usted proporciona una instancia de ICoreWebView2ExecuteScriptCompletedHandler que tiene un Invoke método que le proporciona el código de éxito o error de la ExecuteScript solicitud, así como el segundo parámetro, resultObjectAsJson que es la JSON del resultado de ejecutar el script.

Puede implementar manualmente las CompleteHandler interfaces delegados o puede usar la función de devolución de llamada WRL. La función de devolución de llamada se usa en el siguiente fragmento de código WebView2.

void ScriptComponent::InjectScript()
{
    TextInputDialog dialog(
        m_appWindow->GetMainWindow(),
        L"Inject Script",
        L"Enter script code:",
        L"Enter the JavaScript code to run in the webview.",
        L"window.getComputedStyle(document.body).backgroundColor");
    if (dialog.confirmed)
    {
        m_webView->ExecuteScript(dialog.input.c_str(),
            Callback<ICoreWebView2ExecuteScriptCompletedHandler>(
                [](HRESULT error, PCWSTR result) -> HRESULT
        {
            if (error != S_OK) {
                ShowFailure(error, L"ExecuteScript failed");
            }
            MessageBox(nullptr, result, L"ExecuteScript Result", MB_OK);
            return S_OK;
        }).Get());
    }
}

Eventos

Los eventos de la API de C++ de WebView2 usan el add_EventName remove_EventName par de métodos and para suscribirse y anular la suscripción de eventos. El add_EventName método toma una interfaz de delegado de controlador de eventos y devuelve un EventRegistrationToken como parámetro de salida. El remove_EventName método toma una EventRegistrationToken y cancela la suscripción de la suscripción a eventos correspondiente.

Las interfaces de delegación de controlador de eventos funcionan muy de forma similar al método Async interfaces delegadas de controlador completas. Implementa la interfaz de delegación del controlador de eventos y CoreWebView2 envía una devolución de llamada siempre que se desencadena el evento. Cada interfaz delegada del controlador de eventos tiene un Invoke método único que tiene un parámetro Sender seguido de un parámetro de argumentos de evento. El remitente es la instancia del objeto en el que suscribiste eventos. El parámetro de argumentos de evento es una interfaz que contiene información sobre el evento que se está desencadenando en ese momento.

Por ejemplo NavigationCompleted , el evento on ICoreWebView2 tiene ICoreWebView2::add_NavigationCompleted el ICoreWebView2::remove_NavigationCompleted par y método. Al solicitar agregar, se proporciona una instancia de ICoreWebView2NavigationCompletedEventHandler en la que ha implementado previamente un Invoke método. Cuando NavigationCompleted se activa el evento, Invoke se solicita el método. El primer parámetro es el ICoreWebView2 que está desencadenando el NavigationCompleted evento. El segundo parámetro es el ICoreWebView2NavigationCompletedEventArgs que contiene información sobre si la navegación se completó correctamente y así sucesivamente.

Del mismo modo que el método asincrónico completó la interfaz de delegado de controlador, puedes implementarla directamente o puedes usar la función de devolución de llamada WRL que se usa en el siguiente fragmento de código WebView2.

// Register a handler for the NavigationCompleted event.
// Check whether the navigation succeeded, and if not, do something.
// Also update the Cancel buttons.
CHECK_FAILURE(m_webView->add_NavigationCompleted(
    Callback<ICoreWebView2NavigationCompletedEventHandler>(
        [this](ICoreWebView2* sender, ICoreWebView2NavigationCompletedEventArgs* args)
            -> HRESULT {
            BOOL success;
            CHECK_FAILURE(args->get_IsSuccess(&success));
            if (!success)
            {
                COREWEBVIEW2_WEB_ERROR_STATUS webErrorStatus;
                CHECK_FAILURE(args->get_WebErrorStatus(&webErrorStatus));
                if (webErrorStatus == COREWEBVIEW2_WEB_ERROR_STATUS_DISCONNECTED)
                {
                    // Do something here if you want to handle a specific error case.
                    // In most cases it is not necessary, because the WebView
                    // displays an error page automatically.
                }
            }
            m_toolbar->SetItemEnabled(Toolbar::Item_CancelButton, false);
            m_toolbar->SetItemEnabled(Toolbar::Item_ReloadButton, true);
            return S_OK;
        })
        .Get(),
    &m_navigationCompletedToken));

Cadena

Los parámetros de salida LPWSTR de cadenas son cadenas terminadas en NULL. El solicitante asigna la cadena usando CoTaskMemAlloc . La propiedad se transfiere al solicitante y el solicitante debe liberarla con la memoria CoTaskMemFree .

La cadena de parámetros son LPCWSTR cadenas terminadas en NULL. El solicitante garantiza que la cadena es válida durante la solicitud de la función sincrónica. Si el receptor debe conservar ese valor en algún punto después de que finalice la solicitud de función, el receptor debe asignar una copia asociada del valor de la cadena.

URI y análisis de JSON

Varios métodos proporcionan o aceptan identificadores URI y JSON como cadenas. Use su propia biblioteca preferida para analizar y generar las cadenas.

Si WinRT está disponible para tu aplicación, puedes usar los RuntimeClass_Windows_Data_Json_JsonObject métodos y IJsonObjectStatics para analizar o producir cadenas JSON o RuntimeClass_Windows_Foundation_Uri IUriRuntimeClassFactory métodos para analizar y producir URI. Ambos métodos funcionan en aplicaciones Win32.

Si usas IUri y CreateUri para analizar los URI, es posible que desees usar los siguientes marcadores de creación de URI para que el CreateUri comportamiento coincida más estrechamente con el análisis de URI en la vista de usuario.

Uri_CREATE_ALLOW_IMPLICIT_FILE_SCHEME | Uri_CREATE_NO_DECODE_EXTRA_INFO