VS编写DLL
2015-09-24 22:15
211 查看
1.动态链接库(Dynamic Link Library或者Dynamic-link library,缩写为DLL),是微软公司在微软视窗操作系统中实现共享函数库概念的一种实作方式。DLL是一个包含可由多个程序同时使用的代码和数据的库,DLL不是可执行文件。这些库函数的扩展名是.DLL、OCX(包含ActiveX控制的库)或者.DRV(旧式的系统驱动程序)。函数的可执行代码位于一个DLL
中,该DLL 包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。DLL 还有助于共享数据和资源。多个应用程序可同时访问内存中单个DLL 副本的内容。DLL 是一个包含可由多个程序同时使用的代码和数据的库。
2.DLL的优点:扩展了应用程序的特性,可以用许多种编程语言来编写,简化了软件项目的管理,有助于资源共享,有助于应用程序的本地化,有助于解决平台差异。
3.如何用MFC编写自己的DLL程序呢?
3.1文件->新建项目-.>MFC(MFC DLL)->下一步->带静态链接MFC的规则DLL->完成。
3.2在xxxDLL.h文件中添加函数声明,如:extern "C" int __declspec(EXPORT) funcname();
说明:extern "C" 表明C程序也可以调用; __declspec(EXPORT) 用于导出函数说明;
3.3在xxxDLL.cpp文件中添加函数定义,如:
extern "C" int __declspec(EXPORT) funcname()
{
return xxx_funcname();
}
3.4在xxxDLL.def文件中添加funcname1 @1
funcname2 @2 等
3.5生成xxxDLL.dll和xxxDLL.lib文件
4.如何调用编写的DLL文件?
4.1动态调用:
HINSTANCE m_hInstPrint;
m_hInstPrint = LoadLibrary(L"xxxDLL.dll"); //加载库
typedef int( *pFunc)(); //typedef 定义函数指针
pFunc Func;
Func= (pFunc)GetProcAddress(m_hInstPrint,"funcname"); //从库中获得funcname函数的指针
if(Func!= NULL)
{
BOOL ret;
ret = Func();
if(ret == TRUE)
{
//
}
else
{
//
}
}
FreeLibrary(m_hInstPrint); //卸载库
4.2静态调用
将生成的.dll和.lib文件拷入到调用dll的工程中,用命令 #pragma comment(lib,"dllTest.lib"),实现静态调用,即把该dll在编译的时候也编译到exe文件中去,而后在工程中调用时用下面的代码: #pragma comment(lib,"dllTest.lib") //.lib文件中仅仅是关于其对应DLL文件中函数的重定位信息 extern "C" __declspec(dllimport) add(int x,int y); int main(int argc,
char* argv[]) { int result = add(2,3); printf("%d",result); return 0; } 由上述代码可以看出,静态调用方式的顺利进行需要完成两个动作: (1)告诉编译器与DLL相对应的.lib文件所在的路径及文件名,#pragma comment(lib,"dllTest.lib")就是起这个作用。 程序员在建立一个DLL文件时,连接器会自动为其生成一个对应的.lib文件,该文件包含了DLL 导出函数的符号名及序号(并不含有实际的代码)。在应用程序里,.lib文件将作为DLL的替代文件参与编译。译。
另外一种显式调用的方式是设置vc中的目录和includefiles来实现 (2)声明导入函数,extern "C" __declspec(dllimport) add(int x,int y)语句中的__declspec(dllimport)发挥这个作用。 静态调用方式不再需要使用系统API来加载、卸载DLL以及获取DLL中导出函数的地址。这是因为,当程序员通过静态链接方式编译生成应用程序时,应用程序中调用的与.lib文件中导出符号相匹配的函数符号将进入到生成的EXE 文件中,.lib文件中所包含的与之对应的DLL文件的文件名也被编译器存储在
EXE文件内部。当应用程序运行过程中需要加载DLL文件时,Windows将根据这些信息发现并加载DLL,然后通过符号名实现对DLL 函数的动态链接。这样,EXE将能直接通过函数名调用DLL的输出函数,就象调用程序内部的其他函数一样。
中,该DLL 包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。DLL 还有助于共享数据和资源。多个应用程序可同时访问内存中单个DLL 副本的内容。DLL 是一个包含可由多个程序同时使用的代码和数据的库。
2.DLL的优点:扩展了应用程序的特性,可以用许多种编程语言来编写,简化了软件项目的管理,有助于资源共享,有助于应用程序的本地化,有助于解决平台差异。
3.如何用MFC编写自己的DLL程序呢?
3.1文件->新建项目-.>MFC(MFC DLL)->下一步->带静态链接MFC的规则DLL->完成。
3.2在xxxDLL.h文件中添加函数声明,如:extern "C" int __declspec(EXPORT) funcname();
说明:extern "C" 表明C程序也可以调用; __declspec(EXPORT) 用于导出函数说明;
3.3在xxxDLL.cpp文件中添加函数定义,如:
extern "C" int __declspec(EXPORT) funcname()
{
return xxx_funcname();
}
3.4在xxxDLL.def文件中添加funcname1 @1
funcname2 @2 等
3.5生成xxxDLL.dll和xxxDLL.lib文件
4.如何调用编写的DLL文件?
4.1动态调用:
HINSTANCE m_hInstPrint;
m_hInstPrint = LoadLibrary(L"xxxDLL.dll"); //加载库
typedef int( *pFunc)(); //typedef 定义函数指针
pFunc Func;
Func= (pFunc)GetProcAddress(m_hInstPrint,"funcname"); //从库中获得funcname函数的指针
if(Func!= NULL)
{
BOOL ret;
ret = Func();
if(ret == TRUE)
{
//
}
else
{
//
}
}
FreeLibrary(m_hInstPrint); //卸载库
4.2静态调用
将生成的.dll和.lib文件拷入到调用dll的工程中,用命令 #pragma comment(lib,"dllTest.lib"),实现静态调用,即把该dll在编译的时候也编译到exe文件中去,而后在工程中调用时用下面的代码: #pragma comment(lib,"dllTest.lib") //.lib文件中仅仅是关于其对应DLL文件中函数的重定位信息 extern "C" __declspec(dllimport) add(int x,int y); int main(int argc,
char* argv[]) { int result = add(2,3); printf("%d",result); return 0; } 由上述代码可以看出,静态调用方式的顺利进行需要完成两个动作: (1)告诉编译器与DLL相对应的.lib文件所在的路径及文件名,#pragma comment(lib,"dllTest.lib")就是起这个作用。 程序员在建立一个DLL文件时,连接器会自动为其生成一个对应的.lib文件,该文件包含了DLL 导出函数的符号名及序号(并不含有实际的代码)。在应用程序里,.lib文件将作为DLL的替代文件参与编译。译。
另外一种显式调用的方式是设置vc中的目录和includefiles来实现 (2)声明导入函数,extern "C" __declspec(dllimport) add(int x,int y)语句中的__declspec(dllimport)发挥这个作用。 静态调用方式不再需要使用系统API来加载、卸载DLL以及获取DLL中导出函数的地址。这是因为,当程序员通过静态链接方式编译生成应用程序时,应用程序中调用的与.lib文件中导出符号相匹配的函数符号将进入到生成的EXE 文件中,.lib文件中所包含的与之对应的DLL文件的文件名也被编译器存储在
EXE文件内部。当应用程序运行过程中需要加载DLL文件时,Windows将根据这些信息发现并加载DLL,然后通过符号名实现对DLL 函数的动态链接。这样,EXE将能直接通过函数名调用DLL的输出函数,就象调用程序内部的其他函数一样。
相关文章推荐
- Git学习记录
- Jenkins整合XCode详解
- [Goal] 9/21 ThoughtWorks宣讲会
- 正则表达式
- C++基础复习---4(内存分配)
- 健康问答API接口-健疑问开放接口
- MATLAB:镜像图片
- 使用wireshark进行EtherCAT分析实时性~~·
- 矩阵快速幂模板
- Android中dp,px,sp概念梳理以及如何做到屏幕适配
- 分治-归并排序1
- An interesting scroll background------ActionScript3.0
- c++基础复习-----3(位运算)
- 高效缓存服务器Memcached(一)
- 数据库的事务,事务的特性以及回滚
- 9.24
- jquery实现ul列表中点击li选择radio
- C++基础复习-----2(const 与static)
- UVA 11729 Commando War 突击战 【贪心】
- 分支结构 -- 2015/09/23