有一些东西是一定要动手实现的,学习有的点可以慢慢积累,但是有一些基本的盲区是一定不要跨过去的。
这里不过多的讲解Dll的内容,只是记录一下常用的两种dll编写方法。
一. Dll的编写
第一种方法:
首先打开vs2010---> win32 application--->选择一个dll工程(MyDll)---->不要选择空项目,让它帮你生产dllmain函数入口。你熟悉以后也可以自己写。
// dllmain.cpp #include "stdafx.h" BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return TRUE; }
第一种方式使用 extern "C" _declspec(dllexport)的方式,我们以 加减法为例子:
// MyDll.cpp extern "C" _declspec(dllexport) int Max(int a, int b); extern "C" _declspec(dllexport) int Min(int a, int b); int Max(int a, int b) { if(a>=b)return a; else return b; } int Min(int a, int b) { if(a>=b)return b; else return a; }
第二种方式:
(1)去掉 以下申明
//extern "C" _declspec(dllexport) int Max(int a, int b); //extern "C" _declspec(dllexport) int Min(int a, int b);
(2)在Min,Max函数前面加上 extern "c" ,导出函数一定要按这种方式来写,避免调用错误。
extern "c" int Max(int a, int b) { if(a>=b)return a; else return b; } extern "c" int Min(int a, int b) { if(a>=b)return b; else return a; }
(3) 添加.def文件,在该文件中写明输出函数(由于我的vs不能自动添加,因为我在本地手动创建了一个.def文件,并在工程配置属性Link-->Input--->Module Definition File中配置.def文件名称)
; ; Cmpnt1 module-definition file ; LIBRARY MyDll.dll DESCRIPTION '(c)1996-1997 Dale E. Rogerson' EXPORTS Min @1 PRIVATE Max @2 PRIVATE
直接Build工程即可在目录下生成相应的.lib和.dll文件。
二. Dll的调用
(1) 隐式链接。
隐式链接就是在程序开 始执行时就将 DLL文件加载到应用程序当中。只要将导入函数关键字 _declspec (dllimport) 函数名等写到应用程序相的头文件中就可 以了。这种方法需要把.lib文件也拷贝到你的测试工程下。
#pragma comment(lib,"Messagebox.lib") extern "C"_declspec(dllimport) int Max(int a,int b); extern "C"_declspec(dllimport) int Min(int a,int b); #include <windows.h> #include<stdio.h> int main() { int a; a=Max(8,10); printf("比较的结果为%d\n",a); a=Min(8,10); printf("比较的结果为%d\n",a); return 0; }
(2)动态链接
动态链接不需要拷贝.lib文件到测试工程目录。动态链接是在程序中动态加载,动态卸载,这样可以减少内存使用。在应用程序中用LoadLibrary或MFC提供的AfxLoadLibrary显式的将自己所做的动态链接库调进来。然后再用GetProcAddress()获取想要引入的函数。程序退出时使用FreeLibrary或AfxFreeLibrary释放动态链接库。
/* 注意:要将之前的MyDll.dll拷贝到工程目录哦,不需要拷贝lib */ #include<windows.h> #include<stdio.h> void main(void) { //使用类型定义关键字定义指向DLL中相同的函数原型指针 typedef int(*pMax)(int a,int b); typedef int(*pMin)(int a,int b); HINSTANCE hDLL;//声明一个DLL实例文件句柄 pMax Max; int a=0; hDLL=LoadLibrary("MyDll.dll");//加载动态链接库MyDll.dll文件; Max=(pMax)GetProcAddress(hDLL,"Max");//获取导入到应用程序中的函数指针 a=Max(5,8); printf("比较的结果为%d\n",a); FreeLibrary(hDLL);//卸载MyDll.dll文件; }
参考:见附件!
相关推荐
dll入门 pdf,word版及源码 pdf,word版及源码
VC MFC DLL 入门资料 VC MFC DLL 入门资料
LIB和dll入门实例,简单明了,现学现用
自己写的dll入门例子,用VS2010写的,便于使用vs的初学者参考,这些例子参考的书是http://download.csdn.net/detail/CSUCFL/356187
例如DLL,COM,Socket,多线程等等。这些技术的特点就是使用广泛,但是误解很多;网上教程很多,但是几乎没有什么优质良品。我以近几个月来的编程经验发现,很有必要好好的总结一下这些编程技术了。
DLL的简单入门例子,详细解释见: http://blog.csdn.net/longlong530/article/details/9136895 不要分了,大家帮顶下就好了~^_^
一个很详细的关于VC的dll编写的文档,感觉很不错所以拿出来分享
简单明了的介绍了VC,MFC和DLL的基础知识,配有VC6.0环境下的示例代码。
包含五个文档代码,详细介绍DLL ,MFC规则下, 非MFC规则 等。 物超所值!!
图文手把手教你一步步用VC 2010通达信缠论插件(1-DLL设计入门).pdf
DLL 学习例子,很适合初学者,可分为动态,静态加载
DLL入门的基本步骤详解,对于想学DLL但又不知道如何下手的朋友非常有帮组!
dll的源码和注释,新手下载
dll入门介绍和简单应用,主要是在MFC下编写了自己的dll并在其他的程序中使用我们编写好的dll文件。
dll编程入门资料(C++语言)。简单易懂。
简单的说,dll有以下几个优点: 1) 节省内存。同一个软件模块,若是以源代码的形式重用,则会被编译到不同的可执行程序中,同时运行这些exe时这些模块的二进制码会被重复加载到内存中。如果使用dll,则只在内存中...
这是一本关于C++ Dll 编写 入门的书籍,简单易懂。
windows中dll的编写入门手册,详细讲述怎样编写dll
怎样编写dll