扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
调用DLL有两种方法:静态调用和动态调用.
创新互联专业为企业提供赣榆网站建设、赣榆做网站、赣榆网站设计、赣榆网站制作等企业网站建设、网页设计与制作、赣榆企业网站模板建站服务,十年赣榆做网站经验,不只是建网站,更提供有价值的思路和整体网络服务。
(一).静态调用其步骤如下:
1.把你的youApp.DLL拷到你目标工程(需调用youApp.DLL的工程)的Debug目录下;
2.把你的youApp.lib拷到你目标工程(需调用youApp.DLL的工程)目录下;
3.把你的youApp.h(包含输出函数的定义)拷到你目标工程(需调用youApp.DLL的工程)目录下;
4.打开你的目标工程选中工程,选择Visual C++的Project主菜单的Settings菜单;
5.执行第4步后,VC将会弹出一个对话框,在对话框的多页显示控件中选择Link页。然后在Object/library modules输入框中输入:youApp.lib
6.选择你的目标工程Head Files加入:youApp.h文件;
7.最后在你目标工程(*.cpp,需要调用DLL中的函数)中包含你的:#include "youApp.h"
注:youApp是你DLL的工程名。
(二).动态调用其程序如下:
动态调用时只需做静态调用步骤1.
01 {
02 HINSTANCE hDllInst = LoadLibrary("youApp.DLL");
03 if(hDllInst)
04 {
05 typedef DWORD (WINAPI *MYFUNC)(DWORD,DWORD);
06 MYFUNC youFuntionNameAlias = NULL;
07 // youFuntionNameAlias 函数别名
08 youFuntionNameAlias = (MYFUNC)GetProcAddress(hDllInst,"youFuntionName");
09 // youFuntionName 在DLL中声明的函数名
10 if(youFuntionNameAlias)
11 {
12 youFuntionNameAlias(param1,param2);
13 }
14 FreeLibrary(hDllInst);
15 }
16 }
显式(静态)调用:
LIB + DLL + .H,注意.H中dllexport改为dllimport
隐式(动态)调用:
DLL + 函数原型声明,先LoadLibrary,再GetProcAddress(即找到DLL中函数的地址),不用后FreeLibrary
1、新建DLLTest文件夹,在该文件夹中新建source文件夹。
2、在source文件夹中造add.c。
3、win+R+cmd请出总指挥“命令行”,输入。
4、继续输入(路径也要随机应变)link /DLL /out:E:\VCfile\DLLTest\source\add.dll E:\VCfile\DLLTest\source\add.obj。
5、新建源文件call_dll.c或.cpp放到DLLTest文件夹,同时add.dll也复制过来。
6、编译,连接运行出现个5。调用成功。
注意事项:
C语言能以简易的方式编译、处理低级存储器。C语言是仅产生少量的机器语言以及不需要任何运行环境支持便能运行的高效率程序设计语言。
一.动态链接库(dll)结构
——dll中定义有两种函数:导出函数(export
function)和内部函数
(internal
function),导出函数可以被其他模块调用,内部函数只能在dll内部使用。我们在用c++定制dll文件时,需要编写的就是包含导出函数表的模块定义文件(.def)和实现导出函数功能的c++文件。下面以sample.dll为例介绍def文件和实现文件的结构:
——1.模块定义文件(.def)是由一个或者多个用于描述dll属性的模块语
句组成的文本文件,每个.def文件至少必须包含以下模块定义语句:
第一个语句必须是library语句,指出dll的名字。
exports语句列出被导出函数的名字。
可以使用description语句描述dll的用途(此句可选)。
";"对一行进行注释(可选)
——2.实现文件(.cpp文件为例)
——实现入口表函数的.cpp文件中,包含dll入口点处理的api函数和导出
函数的代码。
dll制作步骤:
1.编写dll函数实现源代码hello.c
#include
int say_hello(char* name)
{
printf( "hello %s\n ", name);
return 1;
}
2.编写dll函数输出定义文件hello.def.
LIBRARY hello
EXPORTS
say_hello @1
3.编译dll源码,生成dll,lib文件.
3.1 新建命令行窗口
3.2 设置PATH ?? INCLUDE ?? LIB 3个环境变量.
SET PATH=K:\vcnet\vc7\bin;%PATH%
SET INCLUDE=K:\vcnet\vc7\include;%INCLUDE%
SET LIB=K:\vsnet\Vc7\lib;%LIB%
3.3 编译hello.c
cd K:\Source\dllsample (hello.c和hello.def所在目录)
cl /c hello.c
3.4 链接hello.obj,生成hello.dll,hello.lib两个文件.
link /def:hello.def /dll hello.obj
4.测试dll函数.
4.1 编写测试代码 test.c
extern int say_hello(char* name);
int main(int argc,char** argv)
{
say_hello( "robbie ");
return 0;
}
4.2 编译测试代码test.c
cl /c test.c
4.3 链接test.obj和 hello.lib,生成可执行文件test.exe
link test.obj hello.lib
4.4 运行test.exe,屏幕输出:
hello robbie
至此,一个dll构造完毕.
//第一种方法_静态调用法
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等工具查看函数名.
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流