次の方法で共有


JavaScript で WinRT の型とメンバーを表す方法

Web 側のコードからネイティブ側の WinRT コードを呼び出すときに、WebView2 アプリの Web 側の JavaScript コード内から WinRT 型とメンバーを使用する方法を次に示します。

言語に相当する言語

WebView2 WinRT JS プロジェクション ツール (wv2winrt) は、次のように WinRT から JavaScript 言語コンストラクトに変換します。

WinRT 言語コンストラクト JavaScript 表現 備考
UInt8, Int16, UInt16, Int32, UInt32, Int64, UInt64, Single, Double Number
Char, String String JavaScript String インスタンスは、WinRT String インスタンスに変換されます。
Boolean Boolean
Windows.Foundation.DateTime 構造 体 Date
Windows.Foundation.TimeSpan 構造 体 Number
Guid String UUID の文字列表現を含む JavaScript String インスタンス (区切り { と中かっこ } なし) は、対応する UUID に変換されます。 UUID は文字列表現に変換され、先頭と末尾に { と中かっこ文字 } 区切られます。 UUID の詳細については、「 RFC 4122」を参照してください。
IVector<T>, IVectorView<T>, IObservableVector<T> Array および JavaScript オブジェクト RuntimeClass インスタンスが vector インターフェイスを実装している場合は、以下で説明する通常のオブジェクトとして JavaScript で表されますが、JavaScript 配列と同様に動作します。 読み取りと書き込みは、基になる WinRT ベクター オブジェクトに対してライブで実行されます。
IMap<K,V>, IMapView<K,V>, IObservableMap<K,V> JavaScript オブジェクト RuntimeClass インスタンスが map インターフェイスを実装する場合、そのインスタンスは、以下で説明する通常のオブジェクトとして JavaScript で表されますが、基になる WinRT マップ オブジェクトの名前と値を持つプロパティもあります。 読み取りと書き込みは、基になる WinRT マップ オブジェクトに対してライブで実行されます。
Enum JavaScript オブジェクト 列挙型は JavaScript オブジェクトとして表されます。 各列挙値は、JavaScript オブジェクトの Number プロパティです。
Struct JavaScript オブジェクト Struct型は、Struct型メンバー名に対応するプロパティ名を持つ JavaScript オブジェクトに変換されます。 これは双方向の変換です。
Namespace JavaScript オブジェクト 名前空間は、子名前空間、列挙型、または RuntimeClassのプロパティを持つ JavaScript オブジェクトとして表されます。 名前空間には、0、1、または多数の子名前空間、列挙型、またはランタイムクラスがあり、個々の子名前空間、列挙型、ランタイムクラスはそれぞれ独自のプロパティを取得します。
Class JavaScript オブジェクト RuntimeClass クラスは、同じメソッド、プロパティ、およびイベントを持つ JavaScript オブジェクトに変換されます。
Interface JavaScript オブジェクト RuntimeClass インターフェイスは、同じメソッド、プロパティ、およびイベントを持つ JavaScript オブジェクトに変換されます。 JavaScript でのインターフェイスの実装はサポートされません。
クラスの静的メンバー JavaScript オブジェクト プロパティ 以下を参照してください。
クラス コンストラクター JavaScript コンストラクターと関数 以下を参照してください。

JavaScript オブジェクトをホスト オブジェクトに渡す場合:

  • JavaScript Date オブジェクトを VT_DATEとしてホスト オブジェクトに渡す必要がある場合は、ホスト オブジェクトの shouldSerializeDates プロパティを true に設定します。 既定では、Date オブジェクトは、JSON.stringifyを使用して、stringとしてホストに渡されます。
  • JavaScript 型の配列を arrayとしてホスト オブジェクトに渡す必要がある場合は、ホスト オブジェクトの shouldPassTypedArraysAsArrays プロパティを true に設定します。 既定では、型指定された配列は、 IDispatchとしてホストに渡されます。

関連項目:

クラスの静的メンバー

静的プロパティ、静的メソッド、または静的イベントを持つランタイム クラスは、名前空間のプロパティとして表されます。 各静的プロパティ、静的メソッド、および静的イベントは、ランタイム クラスのその JavaScript オブジェクトのプロパティとして表されます。

たとえば、WinRT API 静的メソッドの場合、次 Windows.Foundation.Uri.EscapeComponent

  • Windows.Foundation は名前空間です。
  • Uri は runtimeclass です。
  • EscapeComponent は静的メソッドです。

JavaScript では、表現は次のようになります: chrome.webview.hostObjects.Windows.Foundation.Uri.EscapeComponent

  • EscapeComponent は、 Uri ランタイム クラスの JavaScript オブジェクトのプロパティである JavaScript メソッドです。
  • Uri runtimeclass は、Foundation名前空間の JavaScript オブジェクトのプロパティです。

たとえば、静的メソッド Windows.Foundation.Uri.EscapeComponentを呼び出すには、次を呼び出します。

`chrome.webview.hostObjects.Windows.Foundation.Uri.EscapeComponent("example");`

ここでの JavaScript 名前空間オブジェクトは chrome.webview.hostObjects.Windows.Foundation

クラス コンストラクター

RuntimeClass クラスのコンストラクターは、2 つの方法で呼び出すことができる JavaScript オブジェクトの単一のプロパティとして表されます。

  • JavaScript 名前空間オブジェクトのコンストラクターとして。
  • JavaScript 名前空間オブジェクトの関数として。

たとえば、新しい Windows.Foundation.Uri オブジェクトを作成するには、次の newを使用してコンストラクターとして呼び出すことができます。

`let uri = new chrome.webview.hostObjects.Windows.Foundation.Uri("https://example.com/");`

または、 newなしで関数として呼び出します。

`let uri = chrome.webview.hostObjects.Windows.Foundation.Uri("https://example.com/");`

ここでの JavaScript 名前空間オブジェクトは chrome.webview.hostObjects.Windows.Foundation

メソッドのオーバーロード

複数のメソッドに対して WinRT メソッド名がオーバーロードされている場合、JavaScript からそのメソッド名を呼び出すと、一致する数のパラメーターを持つオーバーロードが呼び出されます。

一致する数のパラメーターを持つ複数のオーバーロードがある場合は、メタデータで見つかった最初のオーバーロードが呼び出されます。

メソッドアウト パラメーター

WinRT メソッドに out パラメーターがある場合、JavaScript からそのメソッドを呼び出すときに、返される結果は、各 out パラメーターのプロパティである JavaScript オブジェクトになります。 メソッドにvoid 以外の戻り値の型がある場合、返される結果オブジェクトには、メソッドの戻り値を含む value という名前のプロパティもあります。

out パラメーターを持つ WinRT メソッドを呼び出すと、メソッド呼び出しのパラメーター リスト内のout パラメーターはすべてスキップされます (配列型でない限り)。 たとえば、 out パラメーターを持ち、void 以外の戻り値の型を持つ WinRT メソッドは、MIDL3 を使用して次のように定義されるとします。

String MethodWithOutParams(String stringParam1, 
                           out Int32 intParam2, 
                           out Int32 intParam3, 
                           String stringParam4);

JavaScript からそのメソッドを呼び出す場合は、 out 引数を省略します。

let result = object.MethodWithOutParams("stringParam1", 
                                        "stringParam4");

次に、WinRT メソッドの戻り値を読み取るために、JavaScript result オブジェクトの value プロパティを読み取ります。 WinRT メソッドの out パラメーターを読み取るために、JavaScript result オブジェクトの対応する名前付きプロパティを読み取ります。

console.assert(result.value == "return value");

console.assert(result.intParam2 == 1);

console.assert(result.intParam3 == 2);

配列型 out パラメーターの場合、メソッドを呼び出すときに、配列をメソッドのパラメーター リストに渡す必要があります。 void以外の戻り値の型の場合、結果配列はメソッド呼び出しに渡される配列を置き換えます。 void戻り値の型の場合、結果配列はメソッド呼び出しの結果になります。

// Both methods update input array values to index values
String NonVoidMethodWithArrayOutParam(out Int[] intArrayParam);

Void VoidMethodWithArrayOutParam(out Int[] intArrayParam);
let input_array1 = [0, 0, 0];

let result1 = object.NonVoidMethodWithArrayOutParam(input_array1);

console.assert(input_array1 == [0, 1, 2])

let input_array2 = [0, 0, 0];

let result2 = object.VoidMethodWithArrayOutParam(input_array2);

console.assert(result2 == [0, 1, 2]);

型指定された配列を配列 out パラメーターとして渡す場合は、 chrome.webview.hostObjects.options.shouldPassTypedArraysAsArraystrue に設定する必要があります。

関連項目:

  • C++ WinRT での WebView2 SDK と Windows App SDK (WinUI3) に関する問題 #2788

関連項目