甘肃住房与城乡建设厅网站,视频宣传片免费模板,电子商务网站建设维护学期总结,文字生成器在线制作#xfeff;#xfeff;#xfeff;转载自#xff1a;http://blog.sina.com.cn/s/blog_53004b4901009h3b.html 应用程序使用DLL可以采用两种方式#xff1a;一种是隐式链接#xff0c;另一种是显式链接。在使用DLL之前首先要知道DLL中函数的结构信息。Visual C6.0转载自http://blog.sina.com.cn/s/blog_53004b4901009h3b.html 应用程序使用DLL可以采用两种方式一种是隐式链接另一种是显式链接。在使用DLL之前首先要知道DLL中函数的结构信息。Visual C6.0或者更先进的版本在VC\bin目录下提供了一个名为Dumpbin.exe的小程序使用方法见VS自带工具dumpbin的使用用它可以查看DLL文件中的函数结构。另外Windows系统将遵循下面的搜索顺序来定位DLL 1包含EXE文件的目录2进程的当前工作目录 3Windows系统目录 4Windows目录5列在Path环境变量中的一系列目录。 1隐式链接 隐式链接就是在程序开始执行时就将DLL文件加载到应用程序当中。实现隐式链接很容易只要将导入函数关键字_declspec(dllimport)函数名等写到应用程序相应的头文件中就可以了。下面的例子通过隐式链接调用MyDll.dll库中的Min函数。首先生成一个项目为TestDll在DllTest.h、DllTest.cpp文件中分别输入如下代码 //Dlltest.h#includeMyDll.h
#pragma comment(libMyDll.lib)
extern C_declspec(dllimport) int Max(int a,int b);
extern C_declspec(dllimport) int Min(int a,int b);
//TestDll.cpp
#includeDlltest.h
void main()
{int a;
amin(8,10)
printf(比较的结果为%d\na);
}在创建DllTest.exe文件之前要先将MyDll.dll和MyDll.lib拷贝到当前工程所在的目录下面也可以拷贝到windows的System目录下。如果DLL使用的是def文件要删除TestDll.h文件中关键字extern C。TestDll.h文件中的关键字Progam commit是要Visual C的编译器在link时链接到MyDll.lib文件当然开发人员也可以不使用#pragma comment(libMyDll.lib)语句而直接在工程的Setting-Link页的Object/Moduls栏填入MyDll.lib既可。 2显式链接 显式链接是应用程序在执行过程中随时可以加载DLL文件也可以随时卸载DLL文件这是隐式链接所无法作到的所以显式链接具有更好的灵活性对于解释性语言更为合适。不过实现显式链接要麻烦一些。在应用程序中用LoadLibrary或MFC提供的AfxLoadLibrary显式的将自己所做的动态链接库调进来动态链接库的文件名即是上述两个函数的参数此后再用GetProcAddress()获取想要引入的函数。自此你就可以象使用如同在应用程序自定义的函数一样来调用此引入函数了。在应用程序退出之前应该用FreeLibrary或MFC提供的AfxFreeLibrary释放动态链接库。下面是通过显式链接调用DLL中的Max函数的例子。
#include windows.h
#include cstdio
void main(void)
{
typedef int(*pMax)(int a,int b);
typedef int(*pMin)(int a,int b);
HINSTANCE hDLL;
PMax Max
HDLLLoadLibrary(MyDll.dll);//加载动态链接库MyDll.dll文件
Max(pMax)GetProcAddress(hDLL,Max);
AMax(5,8);
Printf(比较的结果为%d\na);
FreeLibrary(hDLL);//卸载MyDll.dll文件
} 在上例中使用类型定义关键字typedef定义指向和DLL中相同的函数原型指针然后通过LoadLibray()将DLL加载到当前的应用程序中并返回当前DLL文件的句柄然后通过GetProcAddress()函数获取导入到应用程序中的函数指针函数调用完毕后使用FreeLibrary()卸载DLL文件。在编译程序之前首先要将DLL文件拷贝到工程所在的目录或Windows系统目录下。 使用显式链接应用程序编译时不需要使用相应的Lib文件。另外使用GetProcAddress()函数时可以利用MAKEINTRESOURCE()函数直接使用DLL中函数出现的顺序号如将GetProcAddress(hDLL,Min)改为GetProcAddress(hDLL, MAKEINTRESOURCE(2))函数Min()在DLL中的顺序号是2这样调用DLL中的函数速度很快但是要记住函数的使用序号否则会发生错误。
注意两点
1.上面中提到extern C表明函数使用c语言的风格编译函数这样后面显式调用时GetProcAddress第二个参数就是原来的函数名否则如果使用C编译的话支持函数重载则第二个参数会发生变化想要知道发生了什么变化可以使用前面提到的Dumpbin工具查看dll的生成函数。具体参考文章http://www.cnblogs.com/laogao/archive/2012/12/07/2806528.html
2.MAKEINTRESOURCE()函数可以代替复制dll生成的函数的一大串字符串名但是必须知道函数生成的顺序所以你也必须打开dll查看才能知道。