|  |  |  | Справочное описание GObject |  | 
|---|---|---|---|---|
#include <glib-object.h>
                    GTypePlugin;
                    GTypePluginClass;
void                (*GTypePluginUse)                   (GTypePlugin *plugin);
void                (*GTypePluginUnuse)                 (GTypePlugin *plugin);
void                (*GTypePluginCompleteTypeInfo)      (GTypePlugin *plugin,
                                                         GType g_type,
                                                         GTypeInfo *info,
                                                         GTypeValueTable *value_table);
void                (*GTypePluginCompleteInterfaceInfo) (GTypePlugin *plugin,
                                                         GType instance_type,
                                                         GType interface_type,
                                                         GInterfaceInfo *info);
void                g_type_plugin_use                   (GTypePlugin *plugin);
void                g_type_plugin_unuse                 (GTypePlugin *plugin);
void                g_type_plugin_complete_type_info    (GTypePlugin *plugin,
                                                         GType g_type,
                                                         GTypeInfo *info,
                                                         GTypeValueTable *value_table);
void                g_type_plugin_complete_interface_info
                                                        (GTypePlugin *plugin,
                                                         GType instance_type,
                                                         GType interface_type,
                                                         GInterfaceInfo *info);
Система типов GObject поддерживает динамическую загрузку типов. Интерфейс GTypePlugin используется для обработки жизненного цикла динамически загружаемых типов. Это происходит следующим образом:
  Сначала тип внедряется (обычно после загрузки модуля в первый раз, или вашим основным приложением, 
  которое знает какие модули внедряют какие типы), например:
new_type_id = g_type_register_dynamic (parent_type_id,
                                                "TypeName",
                                                new_type_plugin,
                                                type_flags);
  где new_type_plugin это реализация интерфейса
  GTypePlugin.
  
   На реализованный тип создаётся ссылка, например через
   g_type_class_ref() или через
   g_type_create_instance() 
   (вызывается функцией g_object_new()) 
   или как описано выше выполняя наследование типа из new_type_id.
  
   Это заставит систему типов загрузить реализацию типа вызвав 
   g_type_plugin_use() и 
   g_type_plugin_complete_type_info() для 
   new_type_plugin.
  
   В некоторой точке реализация типа больше не требуется, например после
   g_type_class_unref() или
   g_type_free_instance()
   (вызывается когда количество ссылок экземпляра сброшено до нуля).
  
   Это заставит систему типов сбросить информацию найденную с помощью
   g_type_plugin_complete_type_info() 
   и зтем вызвать
   g_type_plugin_unuse() для 
   new_type_plugin.
Цикл может повторятся от второго шага.
В основном вы должны реализовать GTypePlugin тип
который несёт use_count, как только use_count станет единицей, вы должны загрузить реализацию для успешной обработки наступающего вызова 
g_type_plugin_complete_type_info(). 
Позже, возможно после последующих использованных/неиспользованных вызовов, как только use_count сброшен до 0, вы можете выгрузить реализацию 
снова. Система типов гарантированно вызовет 
g_type_plugin_use() и
g_type_plugin_complete_type_info() снова
когда тип потребуется опять.
GTypeModule это реализация GTypePlugin в которой уже реализованы большинство необходимого для фактической загрузки или выгрузки модуля. Это даже обрабатывает многократную регистрацию типов в модуле.
typedef struct _GTypePlugin GTypePlugin;
Декларация типа GTypePlugin используется как метка для объектов которые реализуют интерфейс GTypePlugin.
typedef struct {
  GTypePluginUse		   use_plugin;
  GTypePluginUnuse		   unuse_plugin;
  GTypePluginCompleteTypeInfo	   complete_type_info;
  GTypePluginCompleteInterfaceInfo complete_interface_info;
} GTypePluginClass;
Интерфейс GTypePlugin используется системой типов для обработки жизненного цикла динамически загружаемых типов.
| GTypePluginUse use_plugin; | Увеличивает количество используемых plugin. | 
| GTypePluginUnuse unuse_plugin; | Уменьшает количество используемых plugin. | 
| GTypePluginCompleteTypeInfo complete_type_info; | Заполняет сструктуры GTypeInfo и 
    GTypeValueTable для типа. 
    Сструктуры инициализируются с помощью memset(s, 0, sizeof (s))перед вызовом этой функции. | 
| GTypePluginCompleteInterfaceInfo complete_interface_info; | Заполняет недостающие части GInterfaceInfo 
    для интерфейса. Сструктуры инициализируются с помощью memset(s, 0, sizeof (s))перед вызовом этой
    функции. | 
void (*GTypePluginUse) (GTypePlugin *plugin);
Тип use_plugin функции 
GTypePluginClass, которая вызывается для увеличения
используемого количества plugin.
| plugin: | GTypePlugin чьё используемое количество должно быть увеличено | 
void (*GTypePluginUnuse) (GTypePlugin *plugin);
Тип unuse_plugin функции GTypePluginClass.
| plugin: | GTypePlugin чьё используемое количество должно быть уменьшено | 
void (*GTypePluginCompleteTypeInfo) (GTypePlugin *plugin, GType g_type, GTypeInfo *info, GTypeValueTable *value_table);
Тип complete_type_info функции GTypePluginClass.
| plugin: | GTypePlugin | 
| g_type: | GType чья информация заполнена | 
| info: | GTypeInfo структура для заполнения | 
| value_table: | GTypeValueTable для заполнения | 
void (*GTypePluginCompleteInterfaceInfo) (GTypePlugin *plugin, GType instance_type, GType interface_type, GInterfaceInfo *info);
Тип complete_interface_info функции GTypePluginClass.
| plugin: | GTypePlugin | 
| instance_type: | GType инстанциируемого типа к которому добавляется интерфейс | 
| interface_type: | GType интерфейса чья информация заполнена | 
| info: | GInterfaceInfo для заполнения | 
void g_type_plugin_use (GTypePlugin *plugin);
Вызывает use_plugin функцию из 
GTypePluginClass принадлежащей 
plugin.
Нет необходимости использовать эту функцию вне системы типов GObject непосредственно.
| plugin: | GTypePlugin | 
void g_type_plugin_unuse (GTypePlugin *plugin);
Вызывает unuse_plugin функцию из 
GTypePluginClass принадлежащей
plugin.
Нет необходимости использовать эту функцию вне системы типов GObject непосредственно.
| plugin: | a GTypePlugin | 
void g_type_plugin_complete_type_info (GTypePlugin *plugin, GType g_type, GTypeInfo *info, GTypeValueTable *value_table);
Вызывает complete_type_info функцию из 
GTypePluginClass принадлежащей 
plugin.
Нет необходимости использовать эту функцию вне системы типов GObject непосредственно.
| plugin: | GTypePlugin | 
| g_type: | GType чья информация заполняется | 
| info: | GTypeInfo структура для заполнения | 
| value_table: | GTypeValueTable для заполнения | 
void                g_type_plugin_complete_interface_info
                                                        (GTypePlugin *plugin,
                                                         GType instance_type,
                                                         GType interface_type,
                                                         GInterfaceInfo *info);
Вызывает complete_interface_info функцию из 
GTypePluginClass принадлежащей 
plugin. 
Нет необходимости использовать эту функцию вне системы типов GObject непосредственно.
| plugin: | GTypePlugin | 
| instance_type: | GType инстанциируемого типа к которому добавляется интерфейс | 
| interface_type: | GType интерфейса чья информация заполняется | 
| info: | GInterfaceInfo для заполнения |