普通网友 2024-02-05 14:52 采纳率: 0%
浏览 7

我这个情况,Qt怎么调用Dll内的函数,帮我(相关搜索:调用函数|动态链接库)


QLibrary myDll;
    myDll.setFileName("D:/Mine/ku/7_55/7_55/HKSM.DLL");
    bool loaded =myDll.load();

    if(loaded)
    {
        QMessageBox::information(NULL,"OK","DLL load is OK!");
    }

我在Qt中先调用了Dll库,用了这段代码,显示了窗口,我认为是成功了
但是,我现在要调用DLL库里面的函数,这是我调用函数写的程序,这次弹出的就是Function is not ok

typedef void (*FunSUSBP)(void*,  void*);

FunSUSBP funSUSBP = (FunSUSBP)myDll.resolve("FunSUSBP");    //援引 函数
        if (!funSUSBP)                  //是否成功连接上 函数
        {
            QMessageBox::information(NULL,"OK","Link to Function is not OK!");

        }

我就调不出来了,因为dll里面的函数实在是太复杂了

我要调用的是这个函数,第一个参数是一个函数

funSUSBP(getUSBPrinter_CallbackProc, (unsigned char *)"HK");
这个函数是

void getUSBPrinter_CallbackProc(getprinterinfo_usbPrinterStateParms_Type *usbPrinterState)//获取打印机回调过程
{
    usableUSBPrinterList_Type *curUSBPL;//定义了一个结构体指针

    if (usbPrinterState == NULL)
        return;
    printf("\nEnter the USB printer discovery call-back processing :register into the USB printer list.\n");//进入USB打印机发现回调处理:注册到USB打印机列表中
    if ((curUSBPL = (usableUSBPrinterList_Type *)malloc(sizeof(usableUSBPrinterList_Type))) == NULL)//给curUSBPL数组分配内存,判断是否为空
    memset(curUSBPL , 0 , sizeof(usableUSBPrinterList_Type));//数组内的值都设定为0
    curUSBPL->usbPrinterState = usbPrinterState;//将得到的值传给curUSBPL结构体指针中的usbPrinterState成员变量
    if (currentUSBPrinterList == NULL)//如果当前USB打印机当前列表指针为空
        currentUSBPrinterList = curUSBPL;//将数组的首地址赋值给-USB打印机当前列表指针
    else
        curUSBPL->next = currentUSBPrinterList;//调用结构体的next的成员变量,把-USB打印机当前列表指针-赋值给next
    currentUSBPrinterList = curUSBPL;//将数组首地址传给列表指针
    currentFoundUSBPrinterNumber ++;//当前找到的打印机编号加一
}//我得到了一个值uPS,我把curUSBPL内的值全设为0,然后我把uSP的值给curUSBPL的结构体指针uuppss,如果List为空,那么我把curUSBPL给它,否则,我把List设为curUSBPL的链表的下一个,然后把curUSBPL传给List,编号加一

这里面的注释都是我自己加的,帮我调出这个函数,好几天了,感谢大家

  • 写回答

4条回答 默认 最新

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

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

    在Qt中调用DLL中的函数时,你已经正确地加载了动态链接库并尝试解析函数。但是,根据你的描述,你似乎遇到了函数未找到或者无法正确调用的问题。以下是一个更完整的示例代码,假设FunSUSBP函数的声明和你在DLL中的定义一致:

    #include <QLibrary>
    #include <QMessageBox>
    
    // 假设这是与DLL中函数匹配的原型声明
    typedef void (*FunSUSBP)(void (*)(getprinterinfo_usbPrinterStateParms_Type *), void*);
    
    int main(int argc, char *argv[])
    {
        QLibrary myDll;
        myDll.setFileName("D:/Mine/ku/7_55/7_55/HKSM.DLL");
    
        if (myDll.load()) // 成功加载dll
        {
            QMessageBox::information(NULL, "OK", "DLL load is OK!");
    
            FunSUSBP funSUSBP = (FunSUSBP)myDll.resolve("FunSUSBP"); // 解析函数
    
            if (!funSUSBP)
            {
                QMessageBox::information(NULL, "Error", "Link to Function is not OK!");
            }
            else
            {
                // 定义一个用于传递给getUSBPrinter_CallbackProc的回调函数
                void getUSBPrinter_CallbackProc(getprinterinfo_usbPrinterStateParms_Type *usbPrinterState)
                {
                    // ... 保留你的实现 ...
                }
    
                // 创建一个指向该回调函数的指针,并将其作为第一个参数传入
                void (*callback)(getprinterinfo_usbPrinterStateParms_Type *) = getUSBPrinter_CallbackProc;
                const unsigned char *param = (unsigned char *)"HK";
    
                // 调用dll函数
                funSUSBP(callback, param);
            }
        }
        else
        {
            QMessageBox::critical(NULL, "Error", "Failed to load DLL");
        }
    
        return 0;
    }
    
    

    注意以下几点:

    1. 确保FunSUSBP的函数原型在你的Qt项目中被正确声明并且与DLL中导出的函数原型完全匹配。
    2. 检查DLL导出函数名是否正确。如果在DLL编译时使用了不同的名称修饰规则(例如C++编译器默认的名称修饰),则需要按照实际情况调整resolve方法中的函数名。
    3. 确保DLL是在与调用它的程序相同架构(32位或64位)下编译的。

    请检查上述所有点,并确认DLL确实导出了名为FunSUSBP且接受相应参数类型的函数。如有必要,请查阅DLL提供的头文件或文档以获取准确的函数原型和调用约定。

    评论

报告相同问题?

问题事件

  • 创建了问题 2月5日

悬赏问题

  • ¥15 ats2837 spi2从机的代码
  • ¥200 wsl2 vllm qwen1.5部署问题
  • ¥100 有偿求数字经济对经贸的影响机制的一个数学模型,弄不出来已经快要碎掉了
  • ¥15 这个公式写进SIMULINK中的function模块的代码中应该是什么样的
  • ¥15 javaweb登陆的网页为什么不能正确连接查询数据库
  • ¥15 数学建模数学建模需要
  • ¥15 已知许多点位,想通过高斯分布来随机选择固定数量的点位怎么改
  • ¥20 nao机器人语音识别问题
  • ¥15 怎么生成确定数目的泊松点过程
  • ¥15 layui数据表格多次重载的数据覆盖问题