aardio调用c语言dll动态库传结构体详细教程
开发日记3.11
此篇用于记录发那科数控机床(Fanuc CNC)采集程序开发中,C语言写底层然后用aardio写窗口调用dll的摸索出来的类型对应和踩坑整理。
由于发那科提供的开发套件是C语言的,所以由C语言编写动态库供其他程序调用,窗口界面也可以使用python等其他程序,C代码可移植Linux平台,本篇为Win平台。
后续再录个视频做一些说明。
后续更新移植Linux方法和发那科机床二次开发记录记录整理。

安装mingw32
下载安装配置
官方地址下载安装:https://sourceforge.net/projects/mingw/
安装方法:https://blog.csdn.net/HandsomeHong/article/details/120803368
↑记得最后要添加一下环境变量
mingw64 编译32位失败,待继续研究。https://zhuanlan.zhihu.com/p/413181676#
安装完成后用以下命令测试是否安装成功
gcc --version
g++ --version
用aardio测试范例程序
打开范例-调用其他语言-GCC-C++
用这个范例测试,注意去除 -municode 这个编译选项,即可成功。
-municode 这个选项与 Unicode(UTF-16) 宽字符相关,是VC++编译器的选项,若使用mingw就没有这个选项,处理宽字符用别的宽字符类型。
↑个人建议C语言编写dll库时不使用宽字符,在外部调用的时候封装返回结果再使用中文枚举类封装展示。

aardio中调用dll
var dll = raw.loadDll($"\cpp.dll",,"cdecl"); //必须要放在aar工程目录下
console.log("dll调用结果:",dll.hello())
C语言函数封装和编译
函数声明
编写可以被DLL导出,被其他程序调用的函数,使用宏来控制是否导出为可被外部调用的方法
#ifdef BUILD_DLL
#define DLL_EXPORT __declspec(dllexport)
#else
#define DLL_EXPORT
#endif
函数声明写法
DLL_EXPORT int hello();
DLL_EXPORT int connectCNC(char *str, unsigned short port, long timeout, unsigned short *FlibHndl );
编译运行和编译DLL库
gcc main.c -o myprogram -L. -lfwlib32; .\myprogram.exe
gcc main.c -o cpp.dll -DBUILD_DLL -L. -lfwlib32 -shared -s -m32 -O2 -static -lgcc -lstdc++ ;mv cpp.dll .\aardio窗体\ -force
数据类型和结构体传参示例
根据手册里的API数据类型,按照对应的结构体传参,参考范例-调用其他语言-C语言-生成DLL

传字符串指针char *str和short整型指针
C函数
int connectCNC(char *str, unsigned short port, long timeout, unsigned short *FlibHndl ){
return cnc_allclibhndl3( str, port, timeout, FlibHndl);
}
aardio 对应写法
//声明 指针用结构体/表
var pthndl = {
WORD x=666;
}
//传入结构体指针,接收返回值,和结构体数据
var ret,pthndl = dll.connectCNC("192.168.1.1",tonumber(mainForm.edit3.text),10,pthndl)
console.log("返回值:",ret)
console.log("连接cnc获取句柄:",pthndl.x)
传结构体参数
C函数和结构体定义
int getCNCStatus(unsigned short FlibHndl, ODBST * odbst){
return cnc_statinfo( FlibHndl, odbst ) ;
}
typedef struct odbst {
short hdck ; /* handl retrace status */
short tmmode ; /* T/M mode */
short aut ; /* selected automatic mode */
short run ; /* running status */
short motion ; /* axis, dwell status */
short mstb ; /* m, s, t, b status */
short emergency ; /* emergency stop status */
short alarm ; /* alarm status */
short edit ; /* editting status */
} ODBST ;
对应aardio表定义和传参写法
//设备状态结构体定义
ptODBST = {
word hdck ; /* handl retrace status */
word tmmode ; /* T/M mode */
word aut ; /* selected automatic mode */
word run ; /* running status */
word motion ; /* axis, dwell status */
word mstb ; /* m, s, t, b status */
word emergency ; /* emergency stop status */
word alarm ; /* alarm status */
word edit ; /* editting status */
}
ptODBST=cStruct.ptODBST
var ret,ptODBST=dll.getCNCStatus(pthndl.x,ptODBST)
mainForm.static16.text=enumPack.ODBSTrun[ptODBST.run];
console.log("getCNCStatus:",ret)
字符串数组 char[]传参
C函数和结构体定义
int getExePrgname( unsigned short h, ODBEXEPRG * odbexeprg){
return cnc_exeprgname(h, odbexeprg); //获取文件名
}
typedef struct odbexeprg {
char name[36]; /* running program name */
long o_num; /* running program number */
} ODBEXEPRG; /* */
对应aardio表定义和传参写法
var ptODBEXEPRG= {
byte name[36] ; /* running program name */
long64 o_num; /* running program number */
}
var ret,ptODBEXEPRG=dll.getExePrgname(pthndl.x,ptODBEXEPRG)
console.log("getExePrgname:",ret)
mainForm.static17.text=ptODBEXEPRG.name;
结构体嵌套和结构体数组传参
C函数和结构体定义
typedef struct iodbpsd {
short datano ; /* data number */
short type ; /* axis number */
union {
char cdata ; /* parameter / setting data */
short idata ;
long ldata ;
REALPRM rdata ;
char cdatas[MAX_AXIS] ;
short idatas[MAX_AXIS] ;
long ldatas[MAX_AXIS] ;
REALPRM rdatas[MAX_AXIS] ;
} u ;
} IODBPSD ;
对应aardio表定义和传参写法
//读取公共参数结构体
MAX_AXIS=9;
ptiodbpsd ={
word datano ; /* data number */
word typePra ; /* axis number */
union u= {
byte cdata ; /* parameter / setting data */
word idata ;
int ldata ;
rdata={
int prm_val;
int dec_val ;}
byte cdatas[]={length = MAX_AXIS;} ;
word idatas[]={length = MAX_AXIS;} ;
int ldatas[]={length = MAX_AXIS;} ;
struct rdatas[] ={length = MAX_AXIS;
{int prm_val;
int dec_val ;}};
} ;
} ;
cStruct.MAX_AXIS=3
ptiodbpsd=cStruct.ptiodbpsd
var ret,ptiodbpsd=dll.getParam(pthndl.x,6712,0, (4+4*3), ptiodbpsd )
mainForm.static18.text=ptiodbpsd.u.ldata;
aardio调用c语言dll动态库传结构体详细教程的更多相关文章
- Delphi调用C# 编写dll动态库
Delphi调用C# 编写dll动态库 编写C#dll的方法都一样,首先在vs2005中创建一个“类库”项目WZPayDll, using System.Runtime.InteropServices ...
- java使用JNA框架调用dll动态库
这两天了解了一下java调用dll动态库的方法,总的有三种:JNI.JNA.JNative.其中JNA调用DLL是最方便的. ·JNI ·JNA ·JNative java使用 JNI来调用dll动态 ...
- Delphi - Windows系统下,Delphi调用API函数和7z.dll动态库,自动把文件压缩成.tar.gz格式的文件
项目背景 应欧美客户需求,需要将文件压缩成.tar.gz格式的文件,并上传给客户端SFTP服务器. 你懂的,7-Zip软件的显著特点是文件越大压缩比越高,在Linux系统上相当于我们Windows系统 ...
- Java调用dll动态库
最近项目里使用java调用dll动态库,因此研究了一下这方面的东西. 使用的工具包如下 <dependency> <groupId>net.java.dev.jna</g ...
- Golang调用windows下的dll动态库中的函数
Golang调用windows下的dll动态库中的函数 使用syscall调用. package main import ( "fmt" "syscall" & ...
- Golang调用windows下的dll动态库中的函数 Golang 编译成 DLL 文件
Golang调用windows下的dll动态库中的函数 package main import ( "fmt" "syscall" "time&quo ...
- Qt打开外部程序和文件夹需要注意的细节(Qt调用VC写的动态库,VC需要用C的方式输出函数,否则MinGW32编译过程会报错)
下午写程序中遇到几个小细节,需要在这里记录一下. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 QProcess *process = new QProcess(this ...
- 2017.10.29 C/C++/C#程序如何打成DLL动态库
C/C++程序如何打成DLL动态库: **1.在VS中新建main.h,添加如下内容:** extern "C" _declspec(dllexport) int onLoad() ...
- C/C++/C#程序如何打成DLL动态库
C/C++程序如何打成DLL动态库:1.在VS中新建main.h,添加如下内容:extern "C" _declspec(dllexport) int onLoad(); 2.新建 ...
- .NET 使用 MySql.Data.dll 动态库操作MySql的帮助类--MySqlHelper
.NET 使用 MySql.Data.dll 动态库操作MySql的帮助类--MySqlHelper 參考演示样例代码,例如以下所看到的: /// <summary> /// MySql ...
随机推荐
- Solon 框架启动为什么特别快?
思来想去!可能与 Solon 容器的独立设计有一定关系. 1.Solon 注解容器的运行特点 有什么注解要处理的(注解能力被规范成了四种),提前注册登记 全局只扫描一次,并在扫描过程中统一处理注解相关 ...
- AiTrust下预训练和小样本学习在中文医疗信息处理挑战榜CBLUE表现
项目链接: https://aistudio.baidu.com/aistudio/projectdetail/4592515?contributionType=1 如果有图片缺失参考项目链接 0.项 ...
- 顺颂秋冬<一>
起名字真难. 原来想给这个合集起个积极的名字,记录鄙人浅薄的认知和内心的荒芜. 以及所遇见的温暖. 想来想去,不过是 浮生旧茶 西楼残月之类的 难堪大用. 后来想起来一句, 即,顺颂时祺,秋绥冬禧, ...
- DDR5能给PC带来怎样提升?我们用12款软件进行了对比测试
结论前置:我们使用了12款专业测试软件,分别对DDR5与DDR4内存,在相同平台下进行了测试体验:酷睿i9-12900K搭配DDR4与DDR5,总体差距并不是很大:在y-cruncher测试中,DDR ...
- 如何使用MBP制作Win启动盘
最近有一个需求,想给家人的一台笔记本安装一套win 10的操作系统,但是我手头上现在没有对应的启动U盘. 由于工作原因,很多年没用win了,工作电脑也都是MBP,根本没有之前使用win时熟悉的Ultr ...
- 21.2 静态TLS--《Windows核心编程》
部分笔记来自于:https://blog.csdn.net/Steven_programe_life/article/details/103358251?utm_medium=distribute.p ...
- Linux--如何查看磁盘的IO(top、iostat)
问题背景: 在性能测试时,虽然测试出了结果,但是我们并不知道瓶颈是源端,还是目标端.例如我做上传和下载性能验证,从Linux服务器上向OSS集群上传和下载文件,虽然测试出了速率,但是并不知道上传是否存 ...
- offline 2 online | Cal-QL:校准保守 offline 训出的 Q value,让它与真实 reward 尺度相当
论文标题:Cal-QL: Calibrated Offline RL Pre-Training for Efficient Online Fine-Tuning. NeurIPS 2023,5 5 6 ...
- Vue3学习(16) - 左侧显示分类菜单
写在前面 和大家不太一样,我觉得今年的自己更加relax,没有亲戚要走,没有朋友相聚,也没有很好的哥们要去叙旧,更没有无知的相亲,甚至可以这么说没有那些闲得慌的邻居. 也可以说是从今天开始,算是可以进 ...
- SSL证书类型价格和购买
SSL证书 SSL和HTTPS的工作机制就不多说了, 密钥交换加通道依然是非常靠谱的安全访问方式, 除非你的浏览器连证书和DNS都被劫持, 否则中间节点要解密/篡改HTTPS访问的可能性微乎其微. 现 ...