山东济宁做网站的公司有哪些,成都高新区网站建设,wordpress 视频转码,网站空间怎么更换目录
一般创建方法导出普通函数的方法调用方法导出类及其成员函数的方法调用方法
众所周知#xff0c;我们可以将C项目中的类以及函数导出#xff0c;形成 .dll 文件#xff0c;以供其他程序使用#xff0c;下面将说明Qt环境下的使用方法。
首先创建共享库调用方法导出类及其成员函数的方法调用方法
众所周知我们可以将C项目中的类以及函数导出形成 .dll 文件以供其他程序使用下面将说明Qt环境下的使用方法。
首先创建共享库步骤如下 下一步会出现类对话框等等不用管它直接点击创建即可稍后再将类都删了。
创建好以后你会发现有一个包含global的头文件这个文件中定义了__declspec(dllexport)、__declspec(dllimport)等也可以删掉如果要按照下面的方法的话删掉即可。 本文福利莬费领取Qt开发学习资料包、技术视频内容包括Qt实战项目视频教程代码C语言基础C设计模式Qt编程入门QT信号与槽机制QT界面开发-图像绘制QT网络QT数据库编程QT项目实战QSSOpenCVQuick模块面试题等等↓↓↓↓↓↓见下面↓↓文章底部点击莬费领取↓↓ 接下来还有重要的一步请在.pro文件中加入
CONFIG dll //即使你的代码中写成了 CONFIG staticlib也要改过来
接下来就开始我们具体的的创建方法吧
按照导出dll的的操作划分有两种模式
导出普通方法导出后可静态调用也可动态调用
首先是头文件内容
头文件
在方法声明时前面加上__declspec(dllimport)也可用#define定义看代码
//为了和将来用到的程序中公用一个头文件创建dll时用到的是__declspec(dllexport)而使用dll时用到__declspec(dllimport)完全可以各自写一下
#define TESTDLLSHARED_EXPORT __declspec(dllexport)
#ifdef TESTDLLSHARED_EXPORT
#else
#define TESTDLLSHARED_EXPORT __declspec(dllimport)
#endif//下面我要定义4个普通函数
TESTDLLSHARED_EXPORT int test1();TESTDLLSHARED_EXPORT int test2(void);TESTDLLSHARED_EXPORT int test3(int a);TESTDLLSHARED_EXPORT int test4(int a,int b);
然后在对应的cpp源文件中实现test1、test2、test3、test4这几个方法为了简单我只输出了一句话:
.cpp源文件//记得加上上面的头文件
//记得加上iostream头文件不然cout不能用int test1()
{std::couttest1std::endl;
}int test2(void)
{std::couttest2std::endl;
}int test3(int a)
{std::couttest3std::endl;
}int test4(int a,int b)
{std::couttest4std::endl;
}
接下来就可以创建了创建成功后创建失败请仔细检查代码已验证过你会在你的项目输出目录下找到一个和项目名称一致的.dll文件。
OK!接下来我们来使用这个dll:
使用dll时有两种调用方法一种是静态调用一种是动态调用。
静态调用
首先创建一个常规的C项目将上面生成.dll复制到你的项目输出目录中也就是和.exe文件在一起
接下来打开常规C项目中的.pro文件加入详细的.dll文件地址格式如下
LIBS 项目输出路径\dll文件全称
如我的就是
LIBS D:\Desktop\Go\ClearnProgram\Qt\build-test_dll-Qt-Release\release\HpTickDll.dll
D:\Desktop\Go\ClearnProgram\Qt\build-test_dll-Qt-Release\release是我的项目输出路径HpTickDll.dll是我的dll文件使用时改动一下就好
接下来将创建.dll文件时的头文件复制到当前项目路径下并添加到项目中注意如果你没有按照我上面的#define条件定义方式请重新写__declspec(dllimport)。
接下来在.cpp文件中包含该头文件就可以尽情地使用之前的函数了如直接用test1()等等就和平时编写一样的。
动态调用
特别注意我们在创建时没有用到extern C也没有用到.def 文件保持函数名不变尝试了很多次也不会用.def文件会的欢迎留言因此动态调用时函数名要改因为编译器已经将函数名改了
So你一定会问我们怎么知道dll中的函数名变成啥了不要着急网上直接搜“.dll查看器”遍地都是下载下来后选择我们刚才的.dll文件就可以看了下面是我们的这几个函数test1、test2、test3、test4的新名称你的可能和我的不一样哦 请注意看红色框中的部分不要管其他的我的文件里面还有其他东西这就是四个函数在.dll文件中的名称我小小地猜测了一下后面的v代表参数为void类型i的个数代表int类型参数的个数前面的字母就不太清楚了注意参数个数并未正确列出不过我们只需要正确的函数名不影响。
OK!这就好办了看步骤
同样是创建一个常规C项目不同的是.pro文件中不用加“LIBS 项目输出路径\dll文件全称”这句话了。
接下来在.cpp文件中写主代码(不用添加之前的头文件)
#include iostream
#include windows.hint main()
{//首先定义函数指针用来接收不同参数的函数typedef int (CALLBACK *Fucv)();typedef int (CALLBACK *Fuci)(int);typedef int (CALLBACK *Fucii)(int,int);//获得.dll文件的句柄需要头文件windows.h的支持HINSTANCE hdllLoadLibrary(LtestDll.dll); //L指宽字符串若不写L则会出现错误详情请自查//注意这里要用.dll文件中的函数名Fucv t1(Fucv)GetProcAddress(hdll,_Z5test1v);Fucv t2(Fucv)GetProcAddress(hdll,_Z5test2v);Fuci t3(Fuci)GetProcAddress(hdll,_Z5test3i);Fucii t4(Fucii)GetProcAddress(hdll,_Z5test4ii);//现在的t1就执行的test1的功能以此类推t1();t2();t3(1);t4(1,2);FreeLibrary(hdll);return 0;
}
以上就是普通函数创建.dll和使用.dll的方法看起来动态调用是不是很麻烦但它有许多优点请自查而且据说这里的函数名可以利用.def文件实现不改变名称省去好多麻烦但是我尝试了各种方法如在.pro中利用DEF_FILE添加.def文件还是不行55555会的可以留言哦
导出类及其成员函数导出后可静态调用。暂时不会动态调用某些书上说类不支持动态调用网上有说在类中写一个方法返回类对象但是个人认为这种做法是不对的因为此时肯定是用自己定义的函数指针去定义这个返回类对象方法不可能成功【已验证】当然或许还有更好的方法有知道的欢迎交流哈
对于类的话创建时在class的后面类名的前面加上定义的__declspec(dllexport)使用时换成__declspec(dllimport)也可以参照前面的#define条件定义法。举例
#define HPTICKDLLSHARED_EXPORT __declspec(dllexport)
#ifdef HPTICKDLLSHARED_EXPORT
#else
#define HPTICKDLLSHARED_EXPORT __declspec(dllimport)
#endifclass HPTICKDLLSHARED_EXPORT HpTickDll //我在这里定义了类HpTickDll
{
public:int Start(); //注意成员函数之前不用加HPTICKDLLSHARED_EXPORTint GetTime();private:LARGE_INTEGER li;LONGLONG start, end, freq;int useTime;
};
静态调用的方法和普通函数一样直接可以使用类及其成员函数别忘了添加头文件就不细说了。 本文福利莬费领取Qt开发学习资料包、技术视频内容包括Qt实战项目视频教程代码C语言基础C设计模式Qt编程入门QT信号与槽机制QT界面开发-图像绘制QT网络QT数据库编程QT项目实战QSSOpenCVQuick模块面试题等等↓↓↓↓↓↓见下面↓↓文章底部点击莬费领取↓↓