module.c

来自「gtk插件程序例子说明」· C语言 代码 · 共 86 行

C
86
字号
//module.c
#include <gtk/gtk.h>
#include <gmodule.h>

typedef void (*About) (void);
typedef void (*Dialog) (gchar* message);

GModule *module;
void	on_open(GtkWidget *button, gpointer data){	module = g_module_open("./libhello.so", 0); // G_MODULE_BIND_LAZY);	if(module == NULL)		g_error("ERROR:%s", g_module_error());	gtk_widget_set_sensitive(button, FALSE);}
void	on_dialog(GtkWidget *button, gpointer data)
{	Dialog dialog;
	if(g_module_symbol(module,"create_message_dialog",(gpointer*)&dialog))	{		dialog("这是一个测试用的消息对话框。");	}	else	{		g_error("ERROR:%s", g_module_error());	}	
}

void	on_about(GtkWidget *button, gpointer data)
{	About about;
	if(g_module_symbol(module,"about",(gpointer*)&about))	{		about();	}
	else	{		g_error("ERROR:%s", g_module_error());	}
}
void	on_delete_event(GtkWidget *widget, GdkEvent *event, gpointer data){	g_module_close(module);	gtk_main_quit();}
int	main(int argc, char* argv[])
{
	GtkWidget *window, *vbox, *button;
	gtk_init(&argc, &argv);

	window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
	gtk_window_set_title(GTK_WINDOW(window),"插件功能 -- 动态链接库调用");
	g_signal_connect(G_OBJECT(window),"delete_event",
			G_CALLBACK(on_delete_event),NULL);
	gtk_container_set_border_width(GTK_CONTAINER(window),10);

	vbox = gtk_vbox_new(FALSE,0);
	gtk_container_add(GTK_CONTAINER(window),vbox);	button = gtk_button_new_with_label("调用插件");	gtk_box_pack_start(GTK_BOX(vbox), button, FALSE, FALSE, 0);	g_signal_connect(G_OBJECT(button), "clicked",			G_CALLBACK(on_open), NULL);	button = gtk_button_new_with_label("显示信息对话框");
	gtk_box_pack_start(GTK_BOX(vbox),button,FALSE,FALSE,0);
	g_signal_connect(G_OBJECT(button),"clicked",
			G_CALLBACK(on_dialog),NULL);
	button = gtk_button_new_with_label("显示关于对话框");
	gtk_box_pack_start(GTK_BOX(vbox),button,FALSE,FALSE,0);
	g_signal_connect(G_OBJECT(button),"clicked",
			G_CALLBACK(on_about),NULL);

	gtk_widget_show_all(window);
	gtk_main();
	return FALSE;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?