c++调用dll导出函数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++调用dll导出函数相关的知识,希望对你有一定的参考价值。

int _declspec(dllexport) __stdcall GenStarPic(const char *PicDescribeXml,const char *date,CString TName,int i)

return 0;


以上的导出函数 怎么动态调用。

//第一种方法_静态调用法
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等工具查看函数名. 
参考技术A 最好用隐式链接,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(...));
参考技术B 动态链接的调用步骤:

一、隐式调用
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
参考技术C 两种方法
1:隐式链接. #pragma comment(lib,"DLL项目生成的LIB文件名"),然后在需要的地主调用函数就可以了
2:显式链接.先用LoadLibraryEx加载DLL,再用GetProcAddress找到函数地址.调用函数.
参考技术D 动态链接的调用步骤:
一、隐式调用
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本回答被提问者采纳

以上是关于c++调用dll导出函数的主要内容,如果未能解决你的问题,请参考以下文章

如何仅使用函数名从 DLL 调用函数? C++

从 C++ dll 导出一个类?

在 C# 中找不到 C++ COM DLL 中的导出函数

C++学习(四六一)dll导出函数命名规则

未导出成员函数时,从 C# 调用 C++ 本机/非托管成员函数

C++ DLL导出函数的两种方法(导出序号那种方法,别人看不到函数名)