F8888889 2024-02-21 16:54 采纳率: 0%
浏览 9
已结题

qt6.5内,使用动态链接库内函数传递参数类型不匹配

qt6.5内,使用函数传递参数类型不匹配
一下是结构体定义

typedef struct getprinterinfo_usbPrinterStateParms_S {
        unsigned char                                           isMFP; //If it is MFP, then will be 1, else it is 0 means SFP,
        unsigned char                                           isMono; //If it is a Mono printer, then will be 1, else it is 0 means Color printer
        unsigned char                                           supportNetwork; //If support Network, then it will be 1, else it is 0 means Not-Support or Unknow
        unsigned char                                           *ipV4Address; //Only have meaning when printer support Network
        unsigned char                                           *hostName; //Only have meaning when printer support Network
        unsigned char                                           *usbDevicePortPath;
        unsigned char                                           *modelName;
        void                                                    *privatedParms;
    } getprinterinfo_usbPrinterStateParms_Type;

    typedef struct usableUSBPrinterList_S {
        getprinterinfo_usbPrinterStateParms_Type  *usbPrinterState;//获取打印机信息
        struct usableUSBPrinterList_S             *next;
    } usableUSBPrinterList_Type;

    usableUSBPrinterList_Type                     *currentUSBPrinterList = NULL;

调用的过程如下



 
typedef unsigned char (*GetCurrentUSBPrinterStatus)(getprinterinfo_usbPrinterStateParms_Type * , unsigned char **);



       GetCurrentUSBPrinterStatus getUsb = (GetCurrentUSBPrinterStatus)myDll.resolve("GetCurrentUSBPrinterStatus");


getUsb((getprinterinfo_usbPrinterStateParms_Type*)&Widget::currentUSBPrinterList->usbPrinterState,&printerStatusMessage);

编译后输出的错误为
D:\Mine\ku\7_55\7_55\widget.cpp:60: error: cannot convert 'Widget::getprinterinfo_usbPrinterStateParms_Type*' {aka 'Widget::getprinterinfo_usbPrinterStateParms_S*'} to 'getprinterinfo_usbPrinterStateParms_Type*' {aka 'getprinterinfo_usbPrinterStateParms_S*'} in argument passing
..\7_55\widget.cpp:60:18: error: cannot convert 'Widget::getprinterinfo_usbPrinterStateParms_Type*' {aka 'Widget::getprinterinfo_usbPrinterStateParms_S*'} to 'getprinterinfo_usbPrinterStateParms_Type*' {aka 'getprinterinfo_usbPrinterStateParms_S*'} in argument passing
60 | getUsb((getprinterinfo_usbPrinterStateParms_Type*)&Widget::currentUSBPrinterList->usbPrinterState,&printerStatusMessage);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| |
| Widget::getprinterinfo_usbPrinterStateParms_Type* {aka Widget::getprinterinfo_usbPrinterStateParms_S*}

说是类型不匹配,请改正一下

  • 写回答

17条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-02-21 16:54
    关注

    引自免费微信小程序:皆我百晓生

    根据您提供的错误信息,问题在于传递给 getUsb 函数的参数类型不匹配。在C++中,当结构体定义在类作用域内(如 Widget::getprinterinfo_usbPrinterStateParms_Type)时,它被视为与全局作用域下定义的同名结构体(如 getprinterinfo_usbPrinterStateParms_Type)为不同的类型。

    为了修正这个错误,确保您的动态链接库中的函数和调用它的客户端代码使用相同作用域的结构体定义。有以下两种可能的解决方案:

    1. 如果 getprinterinfo_usbPrinterStateParms_Type 结构体应当是全局可用的,那么请将它的定义移出 Widget 类的作用域到全局作用域。
    // 移动到全局作用域
    typedef struct getprinterinfo_usbPrinterStateParms_S {
        // ...
    } getprinterinfo_usbPrinterStateParms_Type;
    
    class Widget {
        // ...
    };
    
    1. 如果 getprinterinfo_usbPrinterStateParms_Type 应该保留在 Widget 类作用域内,并且动态链接库也依赖于此类型,那么在 DLL 中也需要引用 Widget 类内的定义,并确保调用接口正确。

    鉴于问题描述中没有提供完整的上下文,假设您希望保持结构体定义在 Widget 类内部,同时让动态链接库能够识别这一类型,可以尝试如下方式:

    // 在 Widget.h 文件中公开结构体类型(如果尚未这样做)
    class Widget {
    public:
        typedef struct getprinterinfo_usbPrinterStateParms_S {
            // ...
        } getprinterinfo_usbPrinterStateParms_Type;
    
        // ...
    };
    
    // 确保动态链接库能够访问 Widget 类并使用其内部的结构体定义
    extern "C" {
        unsigned char GetCurrentUSBPrinterStatus(Widget::getprinterinfo_usbPrinterStateParms_Type *, unsigned char **);
    }
    
    // 在 Widget.cpp 调用处,无需转换指针类型
    getUsb(Widget::currentUSBPrinterList->usbPrinterState, &printerStatusMessage);
    

    这样确保了动态链接库和调用端都使用相同的类型来处理结构体指针,从而解决类型不匹配的问题。

    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 2月23日
  • 创建了问题 2月21日

悬赏问题

  • ¥15 x趋于0时tanx-sinx极限可以拆开算吗
  • ¥500 把面具戴到人脸上,请大家贡献智慧
  • ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。
  • ¥15 各位 帮我看看如何写代码,打出来的图形要和如下图呈现的一样,急
  • ¥30 c#打开word开启修订并实时显示批注
  • ¥15 如何解决ldsc的这条报错/index error
  • ¥15 VS2022+WDK驱动开发环境
  • ¥30 关于#java#的问题,请各位专家解答!
  • ¥30 vue+element根据数据循环生成多个table,如何实现最后一列 平均分合并
  • ¥20 pcf8563时钟芯片不启振