1
- #include "WebView2Win32.h"
2
-
3
1
#include "webview2.h"
4
2
5
3
#include <stddef.h>
6
- #include <stdio.h>
4
+ // #include <stdio.h>
7
5
8
6
#define WEBVIEW2_WIN32_API extern
9
7
10
- static inline WCHAR * webview_to_utf16 (const char * s ) {
11
- DWORD size = MultiByteToWideChar (CP_UTF8 , 0 , s , -1 , 0 , 0 );
12
- WCHAR * ws = (WCHAR * )GlobalAlloc (GMEM_FIXED , sizeof (WCHAR ) * size );
13
- if (ws != NULL ) {
14
- MultiByteToWideChar (CP_UTF8 , 0 , s , -1 , ws , size );
15
- }
16
- return ws ;
17
- }
18
-
19
- static inline char * webview_from_utf16 (WCHAR * ws ) {
20
- int n = WideCharToMultiByte (CP_UTF8 , 0 , ws , -1 , NULL , 0 , NULL , NULL );
21
- char * s = (char * )GlobalAlloc (GMEM_FIXED , n );
22
- if (s != NULL ) {
23
- WideCharToMultiByte (CP_UTF8 , 0 , ws , -1 , s , n , NULL , NULL );
24
- }
25
- return s ;
26
- }
8
+ typedef void (* WebView2CallbackFn ) (webview2 * wv , const char * message , void * context );
27
9
10
+ typedef HRESULT (* CreateWebView2EnvironmentWithDetailsFnType ) (PCWSTR browserExecutableFolder , PCWSTR userDataFolder , PCWSTR additionalBrowserArguments , IWebView2CreateWebView2EnvironmentCompletedHandler * environment_created_handler );
11
+ typedef HRESULT (* GetWebView2BrowserVersionInfoFnType ) (PCWSTR browserExecutableFolder , LPWSTR * versionInfo );
28
12
29
13
typedef struct webview2_struct {
30
14
HWND hwnd ;
@@ -43,6 +27,7 @@ typedef struct webview2_struct {
43
27
#define WEBVIEW2_PTR_FROM (_cp , _field ) \
44
28
((webview2 *) ((char *) (_cp) - offsetof(webview2, _field)))
45
29
30
+ static CreateWebView2EnvironmentWithDetailsFnType CreateWebView2EnvironmentWithDetailsFn = NULL ;
46
31
47
32
static HRESULT WebView2WebMessageReceivedEventHandleInvoke (IWebView2WebMessageReceivedEventHandler * This , IWebView2WebView * webView , IWebView2WebMessageReceivedEventArgs * args ) {
48
33
LPWSTR webMessage ;
@@ -84,7 +69,6 @@ static HRESULT CreateWebView2_Invoke(IWebView2CreateWebViewCompletedHandler * Th
84
69
return S_OK ;
85
70
}
86
71
87
-
88
72
static HRESULT CreateWebView2Environment_Invoke (IWebView2CreateWebView2EnvironmentCompletedHandler * This , HRESULT result , IWebView2Environment * webViewEnvironment ) {
89
73
webview2 * pwv2 = WEBVIEW2_PTR_FROM (This , env_created_handler );
90
74
webViewEnvironment -> lpVtbl -> CreateWebView (webViewEnvironment , pwv2 -> hwnd , & pwv2 -> webview_created_handler );
@@ -101,7 +85,7 @@ static ULONG NoOpRelease(void * This) {
101
85
return 1 ;
102
86
}
103
87
104
- static void init_webview2 (webview2 * pwv2 ) {
88
+ static void InitWebView2 (webview2 * pwv2 ) {
105
89
pwv2 -> env_created_handler_vtbl .QueryInterface = (HRESULT (* )(IWebView2CreateWebView2EnvironmentCompletedHandler * This , REFIID riid , void * * ppvObject )) & NoOpQueryInterface ;
106
90
pwv2 -> env_created_handler_vtbl .AddRef = (ULONG (* )(IWebView2CreateWebView2EnvironmentCompletedHandler * This )) & NoOpAddRef ;
107
91
pwv2 -> env_created_handler_vtbl .Release = (ULONG (* )(IWebView2CreateWebView2EnvironmentCompletedHandler * This )) & NoOpRelease ;
@@ -122,11 +106,11 @@ static void init_webview2(webview2 *pwv2) {
122
106
WEBVIEW2_WIN32_API webview2 * CreateWebView2 (HWND hwnd , const char * url ) {
123
107
webview2 * pwv2 = (webview2 * )GlobalAlloc (GMEM_FIXED , sizeof (webview2 ));
124
108
if (pwv2 != NULL ) {
125
- init_webview2 (pwv2 );
109
+ InitWebView2 (pwv2 );
126
110
pwv2 -> webview = NULL ;
127
111
pwv2 -> hwnd = hwnd ;
128
112
pwv2 -> url = url ;
129
- HRESULT res = CreateWebView2EnvironmentWithDetails (NULL , NULL , NULL , & pwv2 -> env_created_handler );
113
+ HRESULT res = CreateWebView2EnvironmentWithDetailsFn (NULL , NULL , NULL , & pwv2 -> env_created_handler );
130
114
if (res != S_OK ) {
131
115
GlobalFree (pwv2 );
132
116
pwv2 = NULL ;
@@ -182,27 +166,33 @@ WEBVIEW2_WIN32_API int WebView2Eval(webview2 *pwv2, const char *js) {
182
166
return 1 ;
183
167
}
184
168
185
- static int WebView2Check () {
186
- LPWSTR versionInfo = NULL ;
187
- HRESULT res = GetWebView2BrowserVersionInfo (NULL , & versionInfo );
188
- return (res == S_OK ) && (versionInfo != NULL );
189
- }
190
-
191
- static webview2_win32 * webview2_win32_prt = NULL ;
192
-
193
- static webview2_win32 webview2_win32_ref ;
194
-
195
- WEBVIEW2_WIN32_API webview2_win32 * GetWebView2Win32 (void ) {
196
- if (webview2_win32_prt == NULL ) {
197
- webview2_win32_prt = & webview2_win32_ref ;
198
- webview2_win32_prt -> create = & CreateWebView2 ;
199
- webview2_win32_prt -> release = & ReleaseWebView2 ;
200
- webview2_win32_prt -> eval = & WebView2Eval ;
201
- webview2_win32_prt -> setBounds = & WebView2SetBounds ;
202
- webview2_win32_prt -> registerCallback = & WebView2RegisterCallback ;
169
+ static int WebView2Enable () {
170
+ TCHAR modulePath [MAX_PATH + 22 ];
171
+ char * webView2Win32Path = getenv ("WEBVIEW2_WIN32_PATH" );
172
+ if ((webView2Win32Path != NULL ) && (strlen (webView2Win32Path ) > MAX_PATH )) {
173
+ webView2Win32Path = NULL ;
203
174
}
204
- if (WebView2Check ()) {
205
- return webview2_win32_prt ;
175
+ if (webView2Win32Path == NULL ) {
176
+ strcpy (modulePath , "WebView2Loader.dll" );
177
+ } else {
178
+ sprintf (modulePath , "%s\\WebView2Loader.dll" , webView2Win32Path );
179
+ }
180
+ HMODULE hWebView2LoaderModule = LoadLibraryA (modulePath );
181
+ if (hWebView2LoaderModule != NULL ) {
182
+ GetWebView2BrowserVersionInfoFnType GetWebView2BrowserVersionInfoFn = (GetWebView2BrowserVersionInfoFnType )GetProcAddress (hWebView2LoaderModule , "GetWebView2BrowserVersionInfo" );
183
+ CreateWebView2EnvironmentWithDetailsFn = (CreateWebView2EnvironmentWithDetailsFnType )GetProcAddress (hWebView2LoaderModule , "CreateWebView2EnvironmentWithDetails" );
184
+ if ((CreateWebView2EnvironmentWithDetailsFn != NULL ) && (GetWebView2BrowserVersionInfoFn != NULL )) {
185
+ LPWSTR versionInfo = NULL ;
186
+ HRESULT res = GetWebView2BrowserVersionInfoFn (NULL , & versionInfo );
187
+ if ((res == S_OK ) && (versionInfo != NULL )) {
188
+ webview_print_log ("WebView2 enabled" );
189
+ return 1 ;
190
+ }
191
+ }
192
+ } else {
193
+ webview_print_log (modulePath );
206
194
}
207
- return NULL ;
195
+ CreateWebView2EnvironmentWithDetailsFn = NULL ;
196
+ webview_print_log ("WebView2Loader not available" );
197
+ return 0 ;
208
198
}
0 commit comments