c++调用dll导出函数

int_declspec(dllexport)__stdcallGenStarPic(constchar*PicDescribeXml,constchar*date,CS... int _declspec(dllexport) __stdcall GenStarPic(const char *PicDescribeXml,const char *date,CString TName,int i)
{
return 0;
}

以上的导出函数 怎么动态调用。
展开
 我来答
吉祥二进制
高粉答主

2013-02-19 · 科技改变生活,生活改变科技。
吉祥二进制
采纳数:33926 获赞数:84577

向TA提问 私信TA
展开全部
//第一种方法_静态调用法
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等工具查看函数名. 
百度网友d17dfdd73e
2013-02-19 · TA获得超过304个赞
知道小有建树答主
回答量:241
采纳率:0%
帮助的人:125万
展开全部
最好用隐式链接,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(...));
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
何度千寻
推荐于2016-03-10 · TA获得超过5898个赞
知道大有可为答主
回答量:1381
采纳率:91%
帮助的人:555万
展开全部
动态链接的调用步骤:

一、隐式调用
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
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友39fe17c85c3
2013-02-19 · 超过34用户采纳过TA的回答
知道答主
回答量:96
采纳率:0%
帮助的人:79.5万
展开全部
两种方法
1:隐式链接. #pragma comment(lib,"DLL项目生成的LIB文件名"),然后在需要的地主调用函数就可以了
2:显式链接.先用LoadLibraryEx加载DLL,再用GetProcAddress找到函数地址.调用函数.
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
逍遥足球子
推荐于2016-07-06 · TA获得超过344个赞
知道答主
回答量:236
采纳率:0%
帮助的人:103万
展开全部
动态链接的调用步骤:
一、隐式调用
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
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式