QT(51)-动态链接库-windows

1.qt- 调用win32 DLL
2.qt- 调用MFC DLL

 


0概述:

01.扩展DLL:
      必须有一个DllMain()函数,且调用AfxInitExtensionModule()函数。
      CRuntimeClass类-初始化函数CDynLinkLibrary。

02.windows定位DLL文件:
   1)exe同一目录
   2)进程当前目录GetCurrentDirectory()
   3) windows系统目录 GetSystemDirectory()  c:\windows\system32
   4) windows目录  GetWindowsDirectory() c:\windows
   5) 列在path环境变量中的一系列目录。

03.32位和64位不能混用
   
 EXE 和DLL需要位数相同。
04. def 文件:
   
 
041:VC6.0创建dll文件时自动生成.def文件,但里面没有函数名,只表名这是一个DLL文件。

; myvcdll.def : Declares the module parameters for the DLL.

LIBRARY      "myvcdll"
DESCRIPTION  'myvcdll Windows Dynamic Link Library'

EXPORTS
    ; Explicit exports can go here

   042:VS2019下创建DLL时不会生成.def文件。
05.dll和exe在同一个文件夹下:
      单独运行EXE时如果出现如下错误:

修改环境变量:把编译使用的路径放到最上面,且重启机器。
这是原来的:

06 dll和exe的文件编码要一致。
 
1.qt- 调用win32 DLL
   1.1 DLL文件编写 :关键字+.def模块文件

       1.11 导出方式:关键字 _declspec(dllexport)mydll.h
        C++:支持重载机制,处理函数名,加入函数的返回类型。
        C: 没有extern “C”时会提示,函数找不到的错误码(DWORD dw=::GetLastError();,得到dw=127)
        1.111 mydll.h头文件如下创建,可被QT和VS创建的exe调用:

#ifndef _MYDLL_H //防止重复引用
#define _MYDLL_H

# ifdef __cplusplus  //如果这是一段cpp代码,那么加入 extern"C"{} 处理其中的代码。
extern "c"{
#endif

_declspec(dllexport) void f();
_declspec(dllexport) int min(int a, int b);

#ifdef __cplusplus
}
#endif
#endif

     1.112 mydll.h头文件如下创建 ,只能被VS创建的exe调用:

#define MYDECLARE_PUBLIC extern "C" _declspec(dllexport)

_declspec(dllexport) void myDLL(void);

  1.12 mydll.cpp

#include "mydll.h"
void f()
{
 MessageBox(0,_T("你好,世界"),0,0);
}


   1.12 模块定义文件:(.def+.h+.cpp)
     
 1.121.testdll.def文件:文件中的函数名就是要导出的函数名            

LIBRARY MYDLL;                //可有可无,DLL名称
DESCRIPTION "这是我的DLL";    //可有可无,DLL的解释

EXPORTS                       //必须有 后面是函数名或者变量名
    f1
	f2 

@ordinal 允许用序号导出函数,而不是以函数名导出。
             
       
1.122.tesdll.h 文件

#ifndef _TEST_H
#define _TEST_H //防止重复引用

#include "tchar.h"  //为了使用_T

 int f1(TCHAR *sz,int n);  
 void f2();

#endif

       1.123.testdll.cpp文件

#include "Test.h"
#include "windows.h" //为了使用MessageBox


int f1(TCHAR *sz, int n)
{
	MessageBox(0,sz, 0, 0);

	return n;
}


void f2()
{
	MessageBox(0, _T(" 你好,f2"), 0, 0);
}

1.2DLL调用
   1.21隐式链接
          导入.lib文件。
          包含头文件。
          exe中调用dll中的函数和类。    

配置:
1.211导入.lib 文件:
链接器->常规->附加库目录:lib库目录
链接器->输入->附加依赖项:lib文件名


 

 1.212包含头文件:
    C/C++->常规->附加包含目录



1.213 exe中调用dll中的函数

#include "../test//mydll.h"
#pragma comment(lib, "mydll.lib")  //隐式链接方式


void myexe::OnBnClickedpbt()
{
	
	f(); //调用dll中的f() 函数
}

2.qt- 调用MFC DLL
  2.11win32 API
  2.12qt自身的API
  2.13直接调用DLL
  2.14可视化设置
   
 
2.11.加载DLL::LoadLibrary(L"D:\C++\myDll\mydll.dll");
    2.12. 得到导出函数的地址:lpfnDllFunc1 = (FUNC)GetProcAddress(hDLL,"f");

    2.13.释放句柄:FreeLibrary(hDLL);

#include <windows.h>
#include <QMessageBox>
typedef void (* FUNC) ();    

 void Dialog::on_pushButton_clicked()
{
    DWORD dw;
    HINSTANCE hDLL; // Handle to DLL
    FUNC lpfnDllFunc1; // Function pointer
    QString str;

    //1.加载
    hDLL = ::LoadLibrary(L"D:\C++\myDll\mydll.dll");
    if (hDLL)
    {
    //2.得到函数句柄
        lpfnDllFunc1 = (FUNC)GetProcAddress(hDLL,"f");
        if (!lpfnDllFunc1)
        {
            dw = ::GetLastError();
            FreeLibrary(hDLL);
            str.sprintf("GetProcAddress failed:%d",dw);
            QMessageBox::information(this,"Error code",str);

        }
        else
        {
     //3. 调用函数+释放句柄
          lpfnDllFunc1();
          FreeLibrary(hDLL);
        }
    }
    else
    {
        dw = ::GetLastError();
        str.sprintf("Load dll failed:%d",dw);
        QMessageBox::information(this,"Error",str);
    }
}

  2.12 calldefdll
      2.121创建项目
      2.122 dll ,lib, def 文件放在同一路径下。

      .def 指定导出函数的具体名字。

EXPORTS
    f1
    f2

  mydll.h  

#ifndef _TEST_H
#define _TEST_H //防止重复引用

#include "tchar.h"  //为了使用_T

 int f1(TCHAR *sz,int n);  
 void f2();

#endif

  mydll.cpp

int f1(char *sz,int n)
{
   MessageBoxA(0,sz,0,0);
   return n;
}


  2.12QT自身的API
   
2.21加载动态库文件  QLibrary myLib("mydll") //动态链接库文件的基本名:mylib 非文件名。
                                      是否成功:isLoaded()
                                      得到函数地址:resolve()
                                      卸载:unload()
    被加载动态库
   

void Dialog::on_pushButton_clicked()
{
     Qlibrary lib("myDll");

}

  2.13直接调用DLL
   
2.131 .lib.dll文件放入exe同一路径下。
    2.132  exe文件编写:
        2.1321exe工程配置文件   .pro文件    导入.lib文件

LIBS += -L$$PWD/ ./ -lmydll 
// -L 导入库路径  相对路径 $$PWD 当前路径   -l库的基本名(没有后缀的文件名)
LIBS += -LD:\QTPrj\build-code_qbytearray-Desktop_Qt_5_14_2_MinGW_32_bit-Debug\debug  -lmydll 
// -L 导入库路径  绝对路径

     2.1322exe新建.h文件,mydll.h 与DLL中的不是一个!!
            ADD new...

#ifndef MYDLL_H
#define MYDLL_H

extern "C" void f();
#endif // MYDLL_H

   2.1323 exe中.cpp文件编写      

#include "myDll.h"

void MainWindow::on_pushButton_clicked()
{
     myDLL();
}


  2.14可视化设置 

 

 

 

 


 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Qt中使用CMSIS-DSP库,可以通过以下步骤进行配置和集成: 1. 下载CMSIS-DSP库:从ARM官方网站上下载CMSIS-DSP库的压缩包,并解压到本地目录。 2. 创建Qt项目:在Qt Creator中创建一个新的Qt项目。 3. 将CMSIS-DSP库添加到项目中:将CMSIS-DSP库中的头文件(.h文件)和源文件(.c文件)添加到Qt项目中。可以在Qt Creator中的项目资源管理器中右键点击项目名称,选择"添加现有文件",并选择CMSIS-DSP库的头文件和源文件。 4. 在.pro文件中添加相关配置:在Qt项目的.pro文件中添加必要的配置,以链接CMSIS-DSP库。例如,可以使用类似以下的语句: ``` INCLUDEPATH += /path/to/cmsis_dsp_library LIBS += -L/path/to/cmsis_dsp_library -larm_cortexM4lf_math ``` 这里的 "/path/to/cmsis_dsp_library" 是CMSIS-DSP库的路径,根据实际情况进行替换。 5. 在Qt代码中使用CMSIS-DSP函数:在Qt项目的代码中,包括所需的头文件,并使用CMSIS-DSP库提供的函数进行信号处理、滤波、FFT等数字信号处理任务。 需要注意的是,CMSIS-DSP库是为ARM Cortex-M处理器优化的。在使用CMSIS-DSP库时,需要确保目标平台与库所针对的处理器兼容。 以上是使用CMSIS-DSP库的基本步骤,具体的集成过程可能会因项目和平台的不同而有所变化。建议参考CMSIS-DSP库的官方文档和Qt的相关文档,以便更详细地了解如何在Qt中使用CMSIS-DSP库。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值