由于之前有些工作确实是可以直接从底层对数据进行读写的,如果采用动态链接库的话应该可以提高效率。
参考资料:

HARRIS对于DLM的官方说明
一个第三方的DLM,用于参考学习
另一个讲DLM的CSDN博客,但个人觉得太复杂了
安装路径下该文件夹中所有文件:/idl/external/dlm/*
安装路径下该依赖项头文件:/idl/external/include/idl_export.h

准备文件

  • 模块名.c:假如你的模块名叫mymodule,则mymodule.c即是用于编译的C源码文件。具体见下方讲解。
  • 模块名.dlm:该文件为/idl/external/dlm/中复件,用于注册DLM,前五行的参数自己看着格式随便改点就可以,重要的是第六行及之后的文本,具体见下方讲解。
  • {build_win.bat | Makefile}:(win平台是bat文件,unix平台是Makefile文件。)该文件为/idl/external/dlm/中复件,用于制作动态链接文件(mymodule.dll/mymodule.so),但这个文件并非通用,需要自己改参数,一是里面的IDL_DIR为安装路径,二是把里面的testmodule替换为你的模块名。这个文件并非必需,只是编译动态链接库会更快捷,当然也可以自己制作Makefile文件。

C源码讲解

其实不管是示例的testmodule还是另一篇博客里面都有好些不需要的,我做了很大的精简。
首先要把idl_export.h加进去。

#include <stdio.h>
#include "idl_export.h"

然后是定义自己在IDL中调用的过程或者函数,我定义的是passfn的过程,将字符串参数打印在屏幕上。

static void passfn(int argc, IDL_VPTR argv[]){printf("argc: %i\n", argc);const char *fn = IDL_VarGetString(argv[0]);printf("argv: %s\n", fn);
}

定义过程的格式是(假如你的过程名为pro1)

static void pro1(int argc, IDL_VPTR *argv){/*你的功能*/
}

定义函数的格式是(加入你的函数名为func1)

static IDL_VPTR func1(int argc, IDL_VPTR *argv){/*你的功能*/return wanted;
}

主要说明的是参数传递,argv是从0开始为第一个参数的,即argv[0]并非存储程序的名称。
此外还需要做类型转换:一是传入参数的类型转换,因为传入的参数是头文件idl_export.h中定义的IDL_VPTR类型,所以需要在头文件中大概2000-3000行的位置找到类型转换的函数,比如IDL_VarGetString用于将IDL的string转换为C的char,IDL_DoubleScalar用于将IDL的double转换为C的double。二则是类似的对于返回值的类型转换。
定义完你的函数/过程之后,加上最后一段让IDL载入函数就大功告成了。

int IDL_Load(void){static IDL_SYSFUN_DEF2 procedure_addr[] = {{ (IDL_FUN_RET) passfn, "PASSFN", 0, IDL_MAX_ARRAY_DIM, 0, 0},};return IDL_SysRtnAdd(procedure_addr, FALSE, IDL_CARRAY_ELTS(procedure_addr));
}

格式:

//加载函数
static IDL_SYSFUN_DEF2 function_addr[] = {{ 函数名, "大写函数名", 最少的参数个数, 最多的参数个数, 应该是最少的关键字个数, 应该是最多的关键字个数},
};
//加载过程
static IDL_SYSFUN_DEF2 procedure_addr[] = {{ (IDL_FUN_RET) 过程名, "大写过程名", 最少的参数个数, 最多的参数个数, 应该是最少的关键字个数, 应该是最多的关键字个数},
};

dlm文件讲解

第六行开始的格式是

FUNCTION 函数名 最少的参数个数 最多的参数个数 {0 | OBSOLETE | KEYWORDS}
PROCEDURE 过程名 最少的参数个数 最多的参数个数 {0 | OBSOLETE | KEYWORDS}

制作动态链接文件

如果不想用IDL提供的makefile,可以自己尝试制作,其实主要分两步(强迫症可以是3步),当然也可以把步骤写入自己的makefile,方便一次性完成:

  1. 编译为汇编文件。编译器一般为gcc或者cc(windows应该是clang.exe,命令为cl),-I后面是额外头文件的路径,也就是idl_export.h的位置,或者其他非系统库函数的位置。此过程在目录下生成模块.o文件。
gcc -I/usr/local/exelis/idl/external/include -c  -fPIC 模块.c
  1. 链接文件。ld命令用于链接。此过程生成可用的模块.so文件。
ld -shared -Bsymbolic --warn-once -noinhibit-exec  -o 模块.so 模块.o
  1. 删除不必要的.o文件
rm 模块.o

开始使用

  1. 生成动态链接库(图中由于已经制作好,所以未显示任何命令)
  2. 打开IDL
  3. DLM_REGISTER, “dlm后缀的完整路径”(必须先注册DLM)
  4. DLM_LOAD, “不带路径的模块名”(可以不用加载模块,调用函数时会自动加载)
  5. 使用函数/过程
    在生成so文件(Windows下为dll文件,macOS为dylib文件)前,会先生成机器代码的.o文件,可以删除。如果不想每次调用自己的函数都需要先REGISTER一下,可以把dlm文件和动态链接文件拷贝到IDL的!DLM_PATH路径下。

C语言编写IDL动态可加载模块(DLM)入门相关推荐

  1. nginx php动态编译加载模块.

    #Nginx动态编译加载模块步骤 #查看目前Nginx版本及编译模块 #[root@centos7 ~]# /opt/app/lnmp/nginx-1.12.0/sbin/nginx -V #ngin ...

  2. Binder跨进程通信原理(一):动态内核加载模块

    先上一张Binder 的工作流程图.(如果不清晰,可以 复制图片链接到浏览器 或 保存到本地 查看,我经常都是这样看图的哈) 一开始上手,陌生的东西比较多,But,其实并不复杂.喔,流程图是用 Pro ...

  3. Linux驱动之内核加载模块过程分析

    Linux内核支持动态的加载模块运行:比如insmod first_drv.ko,这样就可以将模块加载到内核所在空间供应用程序调用.现在简单描述下insmod first_drv.ko的过程 1.in ...

  4. go加载python_人生苦短我用python(02)动态加载模块-Go语言中文社区

    文章内容为原创,欢迎转载请注明出处 作者: EflyPro->晦明禅师 文章来源:公众号"睿江云计算" 继第一期[人生苦短我用Python系列专栏]发布后,深受广大睿普迷的一 ...

  5. python反编译luac_Lua程序逆向之为Luac编写IDA Pro文件加载器

    距离上一次讲Lua程序逆向已经有一段时间了,这一次我们书接上回,继续开启Lua程序逆向系列之旅. 在软件逆向工程实践中,为第三方文件编写文件格式分析器与指令反汇编器是一种常见的场景.这一篇的主要目的是 ...

  6. PySide2动态/静态加载UI及程序发布

    Python目前已经是一个"家喻户晓"的名词了,她可能用在很多行业领域,最牛逼的人工智能(AI).大数据(big data).今天要介绍的是Python图形化界面实现(GUI),记 ...

  7. java 类加载 apk_在Android的App中动态的加载Java类

    原文的地址:http://yenliangl.blogspot.com/2009/11/dynamic-loading-of-classes-in-your.html 我正在编写一个应用程序能够加载别 ...

  8. 省市县乡村 动态级联加载控件AreaRender(二)

    今天很激动啊,昨天下午赶时间写的省市县乡村 动态级联加载控件AreaRender(一)已经有博友评论了, 对于刚开始写博客的我是莫大的鼓励,我会继续写下去,逐步提高自己的文学素养,写出像 T2噬菌体博 ...

  9. postgresql源码学习(57)—— pg中的四种动态库加载方法

    一. 基础知识 1. 什么是库 库其实就是一些通用代码,可以在程序中重复使用,比如一些数学函数,可以不需要自己编写,直接调用相关函数即可实现,避免重复造轮子. 在linux中,支持两种类型的库: 1. ...

最新文章

  1. python使用matplotlib可视化间断条形图、使用broken_barh函数可视化间断条形图、可视化定性数据的相同指标在时间维度上的差异
  2. mysql 视图_mysql视图
  3. 飞鸽_飞鸽2007_飞鸽传书_飞鸽传书2007
  4. 【免费下载】2021年5月热门报告盘点下载
  5. Serial Interface之I2C:关于DS1624 2线通信SDA保持时间的说明
  6. React antD-Pro 添加函数防抖
  7. java多线程join()方法原理详解
  8. 【详细】小程序模板使用教程
  9. python滑稽代码
  10. 2018蓝桥杯 明码 解题方法
  11. “衣带渐宽终不悔,为伊消得人憔悴”的赏析
  12. matlab 收敛速度,BP网络的收敛速度和设计步骤【转】
  13. 在可靠的头肩底中淘金(转 封起De日子)
  14. Ant入门教程(上)
  15. PMP 11.27 考试倒计时37天!来提分啦!
  16. opencv曝光过度_使用 OpenCV 进行曝光融合(Exposure Fusion)成像
  17. RF-2 变量的基本使用
  18. 超导芯片应用计算机,带大家了解几个超导技术在生活中的实际应用张万三给大家超级超导材料技术,要找超导在...
  19. 【QQ】点击查看全文自动跳到加好友页面-PC移动端都可
  20. 重庆交通大学计算机专业分,重庆交通大学计算机类专业2017年在黑龙江理科高考录取最低分数线...

热门文章

  1. IOS开发之——手动设置屏幕旋转
  2. 【英语】为什么老外说的我们听不懂?
  3. R语言实战(中文完整版)pdf
  4. 2022-XTU程设练习1
  5. select函数是怎么用的
  6. qrcode 生成二维码不显示图片解决办法
  7. 【论文阅读笔记】One Shot 3D Photography
  8. u盘读不出来怎么修复?可以试试这个方法
  9. b区计算机复试国家线,今年调剂太恐怖 B区考研分数线竟比A区高?
  10. springboot使用rocketmq-spring-boot-starter整合RocketMQ