博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
接口默认值引发Qt调用DLL异常
阅读量:6288 次
发布时间:2019-06-22

本文共 1524 字,大约阅读时间需要 5 分钟。

在C或C++定义接口(函数)时,有时会使用默认值,这本来是无可厚非的。因为使用默认值,可以简化调用。但在跨语言调用时,这往往会成为一个新的问题。在C#和QT中调用这样的DLL时就会有这样的问题。

我将的sum接口的第二个参数增加了一个默认值,新的接口如下。

EXPORT int sum(int a,int b=100);
如果是按常规调用这个函数,我们写成sum(1)和sum(1,200)都是可以的,但是在作为接口导出为其他语言调用时,就得小心了。可能有人会这样调用。

#include 
#include
#include
typedef int (*SumFunction)(int);//修改后的接口点int main(int argc, char *argv[]){ QLibrary library("../Release/Calculate"); library.load(); if (!library.isLoaded()) { qDebug()<<"Cannot load library."; return 0; } SumFunction sum=(SumFunction)library.resolve("sum"); if (sum) { qDebug()<<"sum="<
sum(1)的结果,期望值应该是101的,可是结果却完全不是。下面是运行结果。

结果显示是-1202723262,这是一个极大的数字。如果多运行几次,会发现这个结果是变化的。那就说明,第二个参数默认值,在作为接口调用时将不在是默认,而是随机变化的。那怎么办呢?

我们采用显示调用,将默认值也作为参数传入。修改后的代码如下。

#include 
#include
#include
typedef int (*SumFunction)(int,int);//显示调用接口点int main(int argc, char *argv[]){ QLibrary library("../Release/Calculate"); library.load(); if (!library.isLoaded()) { qDebug()<<"Cannot load library."; return 0; } SumFunction sum=(SumFunction)library.resolve("sum"); if (sum) { qDebug()<<"sum="<
运行结果如下

sum(1,888),结果是889,正是我们所期的值。

我在项目开发时,就在这里着了道,开始时按正常的代码调用(以前的代码使用的是省去默认参数的接口)进行移值了,结果运行结果怎么做都不对,后来查看了接口文档,发现还有一个默认值,然后加进去,再次运行,一切正常了。

折腾了很久,总是找到了问题。在C#调用DLL时,也有碰到类似的问题。

总结了一下:

1.在调用DLL接口时,一定要采用全参调用(显式),不管有没有默认值。

2.移值以前的代码时,要注意语言的特性,尤其是在参数的数量和类型上。

转载于:https://www.cnblogs.com/sparkleDai/p/7605049.html

你可能感兴趣的文章
OEA 中 WPF 树型表格虚拟化设计方案
查看>>
Android程序开发初级教程(一) 开始 Hello Android
查看>>
使用Gradle打RPM包
查看>>
“我意识到”的意义
查看>>
淘宝天猫上新辅助工具-新品填表
查看>>
再学 GDI+[43]: 文本输出 - 获取已安装的字体列表
查看>>
nginx反向代理
查看>>
操作系统真实的虚拟内存是什么样的(一)
查看>>
hadoop、hbase、zookeeper集群搭建
查看>>
python中一切皆对象------类的基础(五)
查看>>
modprobe
查看>>
android中用ExpandableListView实现三级扩展列表
查看>>
%Error opening tftp://255.255.255.255/cisconet.cfg
查看>>
java读取excel、txt 文件内容,传到、显示到另一个页面的文本框里面。
查看>>
《从零开始学Swift》学习笔记(Day 51)——扩展构造函数
查看>>
python多线程队列安全
查看>>
[汇编语言学习笔记][第四章第一个程序的编写]
查看>>
android 打开各种文件(setDataAndType)转:
查看>>
补交:最最原始的第一次作业(当时没有选上课,所以不知道)
查看>>
Vue实例初始化的选项配置对象详解
查看>>