Skip to content

Commit e8ad6e2

Browse files
committed
Add WebView2 plugin with JavaScript bridge for Rainmeter API interaction.
1 parent 40859de commit e8ad6e2

File tree

3 files changed

+25
-4
lines changed

3 files changed

+25
-4
lines changed

WebView2/Plugin.cpp

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ static bool g_comInitialized = false;
1111
Measure::Measure() : rm(nullptr), skin(nullptr), skinWindow(nullptr),
1212
webViewWindow(nullptr), measureName(nullptr),
1313
width(800), height(600), x(0), y(0),
14-
visible(true), initialized(false)
14+
visible(true), initialized(false), webMessageToken{}
1515
{
1616
// Initialize COM for this thread if not already done
1717
if (!g_comInitialized)
@@ -27,12 +27,32 @@ Measure::Measure() : rm(nullptr), skin(nullptr), skinWindow(nullptr),
2727
// Measure destructor
2828
Measure::~Measure()
2929
{
30+
// Proper cleanup sequence to prevent crashes
31+
32+
// 1. Remove event handlers first
33+
if (webView && webMessageToken.value != 0)
34+
{
35+
webView->remove_WebMessageReceived(webMessageToken);
36+
webMessageToken = {};
37+
}
38+
39+
// 2. Close and release WebView2 controller
3040
if (webViewController)
3141
{
3242
webViewController->Close();
33-
webViewController = nullptr;
43+
webViewController.reset(); // Explicit release
3444
}
3545

46+
// 3. Release WebView COM pointer
47+
if (webView)
48+
{
49+
webView.reset(); // Explicit release
50+
}
51+
52+
// 4. Small delay to allow async cleanup
53+
Sleep(50);
54+
55+
// 5. Destroy window last
3656
if (webViewWindow && IsWindow(webViewWindow))
3757
{
3858
DestroyWindow(webViewWindow);

WebView2/Plugin.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ struct Measure
2727

2828
wil::com_ptr<ICoreWebView2Controller> webViewController;
2929
wil::com_ptr<ICoreWebView2> webView;
30+
EventRegistrationToken webMessageToken;
3031

3132
Measure();
3233
~Measure();

WebView2/WebView2.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -500,7 +500,7 @@ void CreateWebView2(Measure* measure)
500500
// Set initial visibility
501501
measure->webViewController->put_IsVisible(measure->visible ? TRUE : FALSE);
502502

503-
// Set up web message handler
503+
// Set up web message handler and store token for cleanup
504504
measure->webView->add_WebMessageReceived(
505505
Callback<ICoreWebView2WebMessageReceivedEventHandler>(
506506
[measure](ICoreWebView2* sender, ICoreWebView2WebMessageReceivedEventArgs* args) -> HRESULT
@@ -514,7 +514,7 @@ void CreateWebView2(Measure* measure)
514514
return S_OK;
515515
}
516516
).Get(),
517-
nullptr
517+
&measure->webMessageToken
518518
);
519519

520520
// Inject JavaScript bridge

0 commit comments

Comments
 (0)