问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

c++调用dll导出函数

发布网友 发布时间:2022-04-24 07:15

我来回答

5个回答

热心网友 时间:2022-06-17 09:18

//第一种方法_静态调用法
1:在DLL的cpp中将函数声明为导出,你已经完成了第一步.
2: 在exe的cpp中加上一句 #pragma comment(lib, "你生成的dll的lib文件") 生成dll后会有一个xxx.lib的文件,保存到exe的目录中.
3:声明一种类型,在exe的cpp中声明上面的函数类型. 
4:调用函数
//第二种方法动态调用法
1: 在exe的cpp中使用LoadLibary()把我生成的dll载入.
2: 使用typedef int __stdcall (*pfunc) (const char *, const char *, cstring, int) 定义一个函数类型.
3: pfunc funcaddr = GetProcAddrress() 通过GetProcAddress()获取函数的地址.
4: 调用 函数

 注意:
 你写的代码有点小问题,在导出函数的前面先加上 extern "C" ,这样才能保证dll中的函数名是GenStarPic,否则导出函数的名字会变成一堆乱码,你需要借助LordPe或者depends等工具查看函数名. 

热心网友 时间:2022-06-17 09:18

最好用隐式链接,C++显示链接在导出的时候会更改名字,编写比较复杂
隐式链接. #pragma comment(lib,"DLL项目生成的LIB文件名"),然后在需要的地主调用函数

动态库文件(dll)
编写dll
1)声明导出
在XXX.h中:
__declspec(dllexport) 函数声明
extern __declspec(dllexport) 变量声明
在XXX.cpp中:函数定义/变量定义
2)模块定义导出
添加XXX.def文件
XXX.def中添加
LIBRARY "dll文件名"
EXPORTS
函数名 @ 导出序号
变量名 CONSTANT/DATA
使用dll
1)隐式链接
#include "XXX.h" 库函数或变量的声明.
在XXX.cpp中:
__declspec(dllimport) 函数声明
2)显示链接(如果是声明方式导出,导出时需添加extern "C",否则函数名会被编译器修饰.)
#include "XXX.h" 库函数或变量的声明.
typedef 定义函数指针/变量指针.
LoadLibrary();
GetProcAddress();
FreeLibrary();
C++类导出
1)__declspec()方式声明
导出:
XXX.h:class __declspec(dllexport) 类名{};
使用:
XXX.h:class __declspec(dllimport) 类名{};
2)全局函数返回对象方式
导出:
extren "C" __declspec(dllexport) 类* CreateInstance()
{
return new 类;
}
使用:
隐式链接/显示链接
使用DLL中的类的成员函数
方法一:虚函数方法.
将需要使用的成员函数声明为virtual函数
方法二:转换GetProcAddress()的返回值
1)将C++修饰的成员函数名用.def文件导出新的便于使用的函数名
EXPORTS
导出函数名 = 修饰函数名
2)使用类型转换将GetProcAddress()的返回值转换为类成员函数类型
template< typename Src, typename Dest >
Dest force_cast( Src src )
{
uion
{
Src s;
Dest d;
} covertor;
covertor.s = src;
return covertor.d;
}
typedef 返回类型 (类::*DestFunc)(参数类型)
DsetFunc pFunc = force_cast<DestFunc>(GetProcAddress(...));

热心网友 时间:2022-06-17 09:18

动态链接的调用步骤:

一、隐式调用
1、建立DllCnslTest工程
2、将文件DllDemo.dll、DllDemo.lib拷贝到DllCnslTest工程所在的目录
3、在DllCnslTest.h中添加如下语句:
#define DllAPI __declspec(dllimport) #pragma comment(lib,"DllDemo.lib") //在编辑器link时,链接到DllDemo.lib文件 extern "C" { DllAPI int __stdcall Max(int a,int b); }
4、在DllCnslTest.cpp文件中添加如下语句:
#include "DllCnslTest.h"//或者 #include "DllDemo.h" void main() { int value; value = Max(2,9); printf("The Max value is %d\n",value); }
5、编译并生成应用程序DllCnslTest.exe

二、显式调用
1、建立DllWinTest工程。
2、将文件DllDemo.dll拷贝到DllWinTest工程所在的目录或Windows系统目录下。
3、用vc/bin下的Dumpbin.exe的小程序,查看DLL文件(DllDemo.dll)中的函数结构。
4、使用类型定义关键字typedef,定义指向和DLL中相同的函数原型指针。
例:
typedef int(*lpMax)(int a,int b); //此语句可以放在.h文件中
5、通过LoadLibray()将DLL加载到当前的应用程序中并返回当前DLL文件的句柄。
例:
HINSTANCE hDll; //声明一个Dll实例文件句柄 hDll = LoadLibrary("DllDemo.dll");//导入DllDemo.dll动态连接库
6、通过GetProcAddress()函数获取导入到应用程序中的函数指针。
例:
lpMax Max; Max = (lpMax)GetProcAddress(hDLL,"Max"); int value; value = Max(2,9); printf("The Max value is %d",value);
7、函数调用完毕后,使用FreeLibrary()卸载DLL文件。
FreeLibrary(hDll);
8、编译并生成应用程序DllWinTest.exe

热心网友 时间:2022-06-17 09:19

两种方法
1:隐式链接. #pragma comment(lib,"DLL项目生成的LIB文件名"),然后在需要的地主调用函数就可以了
2:显式链接.先用LoadLibraryEx加载DLL,再用GetProcAddress找到函数地址.调用函数.

热心网友 时间:2022-06-17 09:20

动态链接的调用步骤:
一、隐式调用
1、建立DllCnslTest工程
2、将文件DllDemo.dll、DllDemo.lib拷贝到DllCnslTest工程所在的目录
3、在DllCnslTest.h中添加如下语句:
#define DllAPI __declspec(dllimport) #pragma comment(lib,"DllDemo.lib") //在编辑器link时,链接到DllDemo.lib文件 extern "C" { DllAPI int __stdcall Max(int a,int b); }
4、在DllCnslTest.cpp文件中添加如下语句:
#include "DllCnslTest.h"//或者 #include "DllDemo.h" void main() { int value; value = Max(2,9); printf("The Max value is %d\n",value); }
5、编译并生成应用程序DllCnslTest.exe
二、显式调用
1、建立DllWinTest工程。
2、将文件DllDemo.dll拷贝到DllWinTest工程所在的目录或Windows系统目录下。
3、用vc/bin下的Dumpbin.exe的小程序,查看DLL文件(DllDemo.dll)中的函数结构。
4、使用类型定义关键字typedef,定义指向和DLL中相同的函数原型指针。
例:
typedef int(*lpMax)(int a,int b); //此语句可以放在.h文件中
5、通过LoadLibray()将DLL加载到当前的应用程序中并返回当前DLL文件的句柄。
例:
HINSTANCE hDll; //声明一个Dll实例文件句柄 hDll = LoadLibrary("DllDemo.dll");//导入DllDemo.dll动态连接库
6、通过GetProcAddress()函数获取导入到应用程序中的函数指针。
例:
lpMax Max; Max = (lpMax)GetProcAddress(hDLL,"Max"); int value; value = Max(2,9); printf("The Max value is %d",value);
7、函数调用完毕后,使用FreeLibrary()卸载DLL文件。
FreeLibrary(hDll);
8、编译并生成应用程序DllWinTest.exe
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
瑞安皇都大厦几个电梯 办签证和护照的具体步骤和一共的费用!我需要详细一点的答案. 办护照流程 办护照的流程是什么 哪位推荐几部韩剧啊!!要像豪杰春香,魔女幼熙这样的,剧情要感人,最好是... 小阴唇内应该是光滑的吗,阴道口痒为什么 阴道口有像草莓样正常吗 任氏族谱字辈:世秉忠贞 永达明玉起 国正天元律迎祖大继昌 河南夏氏家谱辈分我是永城市酂城镇夏氏夏世界具家谱记载洪武二年始祖良... 夏侯姓字辈排行 夏氏辈行,我爷爷明字辈,我父亲应字辈,我是崇字辈,后面是什么辈? 怎么查看dll函数 vs2010 什么工具能够监视dll文件中的函数调用及传递参数 如何在DLL中导出类的成员函数 怎么提取DLL文件中的导出函数呢? 请问大佬有dll导出函数查看器官方版 v3.5 电脑版软件免费百度云资源吗 怎样用vc&#47;bin下的Dumpbin.exe的小程序,查看DLL文件(.dll)中的函数结构。 如何查看DLL文件的导出函数声明 有一个DLL,怎么知道其导出函数的参数和返回类型 如何查看DLL中的函数名及参数 如何查看dll输出函数的参数? 先下手为强!腾讯注册抢先“狗头”表情包商标,对此你怎么看? 腾讯注册“狗头”表情包商标,此举的原因是什么? 怎么阻止windows10自动更新 如何防止电脑自动更新window 10 请问..我得电脑, windows.总,,自动,,更新..自动下载,,怎么阻止它呢?.. 如何阻止电脑自动更新windows 支墩的埋深 混凝土管道埋地敷设,是不是还要做管道的基础啊?? 怎么做呢?? 施工员的主要任务是什么. 吉华街道成立后干了什么大工程? 准确看看 user32.dll 里有哪些导出函数 如何获取DLL导入导出表的信息和DLL导出的函数名 如何读取dll中的函数及参数? 怎么查看ida调试时其它dll模块的导出函数 为什么有的dll里没有导出函数? 大家的头像一般是哪里来的呀? 大家一般找头像在哪找? 你们QQ头像都在哪找的? QQ头像都上哪找啊 QQ头像在哪一个文件夹里!? 大家的qq头像都是在哪找的? 之前上传的微信头像都到哪里去了? QQ头像的位置在哪 QQ头像在哪 请问大家好看的头像都是哪里找的 qq头像在哪找好? 头像在哪里找 他们哪些好头像都是在哪找的? 执业药师多点执业是利还是弊 多点执业的坏处