emilk / egui

egui: an easy-to-use immediate mode GUI in Rust that runs on both web and native
https://www.egui.rs/
Apache License 2.0
21.99k stars 1.59k forks source link

Unhandled user callback exception on dynamic library interaction #5152

Open CrazyboyQCD opened 2 weeks ago

CrazyboyQCD commented 2 weeks ago

Describe the bug When use dynamic library to render, clicking the exit button the application stop for seconds and exit with error.

To Reproduce Steps to reproduce the behavior: main.rs:

use eframe::egui::{self, Context};
use eframe::{App, Frame};
use libloading::{Library, Symbol};
use std::fs;

pub struct Program {
    libs: Vec<Library>,
}

impl Default for Program {
    fn default() -> Program {
        let plugins = fs::read_dir("libs/").expect("no plugins folder!");
        let mut libs = vec![];
        for plugin in plugins {
            unsafe {
                let path = plugin.unwrap().path();
                let lib = Library::new(path).expect("couldn't find dll");
                libs.push(lib);
            }
        }
        Self { libs }
    }
}

impl App for Program {
    fn update(&mut self, ctx: &Context, _frame: &mut Frame) {
        for lib in &self.libs {
            unsafe {
                let func: Symbol<unsafe extern "C" fn(&Context)> = lib.get(b"render").unwrap();
                func(ctx);
            }
        }
        egui::SidePanel::right("main").show(ctx, |ui| {
            ui.heading("My egui Application Main");
        });
    }
}

fn main() {
    let options = eframe::NativeOptions {
        viewport: egui::ViewportBuilder::default().with_inner_size([320.0, 240.0]),
        ..Default::default()
    };
    eframe::run_native(
        "My egui App",
        options,
        Box::new(|_cc| Ok(Box::<Program>::default())),
    )
    .unwrap();
}

lib.rs:

use eframe::egui;
use eframe::egui::Context;

#[no_mangle]
pub fn render(ctx: &Context) {
    egui::SidePanel::left("dll").show(ctx, |ui| {
        ui.heading("My egui Application dll");
    });
}

Expected behavior Exit normally.

Screenshots image

Desktop (please complete the following information):

Additional context Error appears on both Glow and wgpu backend. Both panic before dropping painter. Eframe version: 0.28.1 Error 0xc000041d exists when exception isn't handled in windows' user callback.

valadaptive commented 6 days ago

The render function in lib.rs is not defined as extern "C" but it is imported as one, which might result in the calling convention mismatching.