• 接口默认值引发Qt调用DLL异常


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

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

    EXPORT int sum(int a,int b=100);  

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

    #include <QtCore/QCoreApplication>
    #include <QLibrary>
    #include <QtDebug>
    
    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);//修改后的调用
        }
    
        return 0;
    }
    sum(1)的结果,期望值应该是101的,可是结果却完全不是。下面是运行结果。


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

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

    #include <QtCore/QCoreApplication>
    #include <QLibrary>
    #include <QtDebug>
    
    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);//显示调用
        }
    
        return 0;
    }

    运行结果如下


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

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

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

    总结了一下:

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

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

  • 相关阅读:
    Eclipse的安装及汉化图解
    Intent常用使用汇总
    Android Notification (转)
    垃圾回收
    svn常见错误汇总
    位运算
    FusionCharts简单教程(一)---建立第一个FusionCharts图形
    Delphi发送邮件...
    协程库的一些笔记
    学习日记之单例模式和Effective C++
  • 原文地址:https://www.cnblogs.com/sparkleDai/p/7605049.html
Copyright © 2020-2023  润新知