程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C語言動態調用庫(轉),動態

C語言動態調用庫(轉),動態

編輯:關於C語言

C語言動態調用庫(轉),動態


轉自:http://cloverprince.iteye.com/blog/481309

現有一個主程序用C語言寫成。現在要允許第三方開發人員編寫擴展的模塊,約定第三方開發的模塊必須提供一系列已知名稱的函數(如 foo(),bar(),baz())。如果要求第三方的模塊必須與主程序的二進制代碼分開發布,把dll或so丟在某個文件夾內即可被動態裝載並使用,應如何實現?

除了用操作系統提供的接口外,還可以用Glib的簡單封裝。GLib簡單封裝了操作系統相關的動態庫裝載函數,位於GModule中。GModule相當於Library
Handle,而g_module_open, g_module_symbol和g_module_close分別對應dlopen, dlsym和dlclose函數。

接口、動態庫同原解 http://cloverprince.iteye.com/blog/481309 ,新的主程序如下:

#include <stdio.h>
#include <stdlib.h>

#include <glib.h>
#include <glib/gstdio.h>
#include <gmodule.h>

#include "plugin-interface.h"

const char * const PLUGINS_PATH = "plugins";

int main(int argc, char** argv) {
    GDir *dir;
    const gchar *filename;

    dir = g_dir_open(PLUGINS_PATH,0,NULL);

    while(filename=g_dir_read_name(dir)) {
        GModule *module;
        char *path;

        InitModuleFunc init_func;
        PluginInterface iface;

        printf("Openning %s ...\n",filename);

        path = g_strdup_printf("%s/%s",PLUGINS_PATH,filename);

        module = g_module_open(path,G_MODULE_BIND_LAZY);
        g_module_symbol(module,"init_module",(void**)(&init_func));
        init_func(&iface);

        iface.hello();
        iface.greet("wks");

        g_module_close(module);

        g_free(path);
    }

    g_dir_close(dir);

    return 0;
}

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved