zoukankan      html  css  js  c++  java
  • [拾零]C/C++_代码复用的实现_静态链接库_动态链接库_使用.def导出

    1 静态链接库

    1.1 创建静态链接库:

    1、在VC6中创建项目:Win32 Static Library
    2、在项目中创建两个文件:xxx.h 和 xxx.cpp
    3、编译

    1.2 使用静态链接库

    方式一:

    1、将xxx.h 和 xxx.lib复制到要使用的项目中
    2、在需要使用的文件中包含:#include "xxx.h"
    3、在需要使用的文件中包含:#pragma comment(lib, "xxx.lib")

    方式二:

    1、将xxx.h 和 xxx.lib复制到要使用的项目中
    2、在需要使用的文件中包含:#include "xxx.h"

    静态链接库的缺点

    使用静态链接生成的可执行文件体积较大,造成浪费
    我们常用的printf、memcpy、strcpy等就来自这种静态库

    2 动态链接库

    2.1 创建DLL

    1、源文件中:

    int __stdcall Plus(int x,int y)			
    {			
    	return x+y;		
    }			
    int __stdcall Sub(int x,int y)			
    {			
    	return x-y;		
    }			
    int __stdcall Mul(int x,int y)			
    {			
    	return x*y;		
    }			
    int __stdcall Div(int x,int y)			
    {			
    	return x/y;		
    }
    

    2、头文件中

    extern "C" _declspec(dllexport) __stdcall int Plus (int x,int y);  		
    extern "C" _declspec(dllexport) __stdcall int Sub (int x,int y);		
    extern "C" _declspec(dllexport) __stdcall int Mul (int x,int y);		
    extern "C" _declspec(dllexport) __stdcall int Div (int x,int y);		
    

    说明:

    1、extern 表示这是个全局函数,可以供各个其他的函数调用;
    2、"C" 按照C语言的方式进行编译、链接
    __declspec(dllexport)告诉编译器此函数为导出函数;

    2.2 使用DLL

    方式一:隐式连接

    步骤1:将 *.dll  *.lib 放到工程目录下面  	
    步骤2:将 #pragma comment(lib,"DLL名.lib") 添加到调用文件中	 
    步骤3:加入函数的声明	 
    extern "C" __declspec(dllimport) __stdcall int Plus (int x,int y);  		
    extern "C" __declspec(dllimport) __stdcall int Sub (int x,int y);		
    extern "C" __declspec(dllimport) __stdcall int Mul (int x,int y);		
    extern "C" __declspec(dllimport) __stdcall int Div (int x,int y);		
    		
    说明:	 		
    __declspec(dllimport)告诉编译器此函数为导入函数;	 	
    

    方式二:显示链接

    步骤1:	//定义函数指针	
    	typedef int (__stdcall *lpPlus)(int,int);	
    	typedef int (__stdcall *lpSub)(int,int);	
    	typedef int (__stdcall *lpMul)(int,int);	
    	typedef int (__stdcall *lpDiv)(int,int);	
    		
    步骤2:  //声明函数指针变量		
    	lpPlus myPlus;	
    	lpSub mySub;	
    	lpMul myMul;	
    	lpDiv myDiv;	
    		
    步骤3:  //动态加载dll到内存中	
    	HINSTANCE   hModule = LoadLibrary("DllDemo.dll"); 	
    		
    步骤4:  //获取函数地址		
    	myPlus = (lpPlus)GetProcAddress(hModule,   "_Plus@8");	
    	mySub = (lpSub)GetProcAddress(hModule,   "_Sub@8");	
    	myMul = (lpMul)GetProcAddress(hModule,   "_Mul@8");	
    	myDiv = (lpDiv)GetProcAddress(hModule,   "_Div@8");	
    		
    		
    步骤5:	//调用函数	
    	int a = myPlus(10,2);	
    	int b = mySub(10,2);	
    	int c = myMul(10,2);	
    	int d = myDiv(10,2);	
    		
    

    特别说明:

    Handle 是代表系统的内核对象,如文件句柄,线程句柄,进程句柄。
    HMODULE 是代表应用程序载入的模块
    HINSTANCE 在win32下与HMODULE是相同的东西 Win16 遗留
    HWND 是窗口句柄

    其实就是一个无符号整型,Windows之所以这样设计有2个目的:
    1、可读性更好
    2、避免在无意中进行运算

    3 使用.def导出

    1、*.h文件	
    	
    int Plus (int x,int y);  	
    int Sub (int x,int y);	
    int Mul (int x,int y);	
    int Div (int x,int y);	
    	
    2、*.cpp文件	
    	
    int Plus(int x,int y)	
    {	
    	return x+y;
    }	
    int Sub(int x,int y)	
    {	
    	return x-y;
    }	
    int Mul(int x,int y)	
    {	
    	return x*y;
    }	
    int Div(int x,int y)	
    {	
    	return x/y;
    }	
    	
    	
    3、*.def文件	
    	
    EXPORTS	
    	
    Plus   	@12
    Sub	@15 NONAME
    Mul    	@13
    Div    	@16
    	
    	
    4、使用序号导出的好处:	
    	
    名字是一段程序就精华的注释,通过名字可以直接猜测到函数的功能	
    	
    通过使用序号,可以达到隐藏的目的.	
    
  • 相关阅读:
    CentOS6找回root密码
    Python3——装饰器及应用(这个属于详细的)
    python3 类的相关内容
    python--- 解释‘yield’和‘Generators(生成器)
    Python 基本类型:元组,列表,字典,字符串,集合 梳理总结
    python3 推导式大总结
    Python3 的描述符--完整例子详细解释
    类 Class 对象、定义、方法
    Python3基础 __repr__ 类的实例对象的名字 可以打印文字(2)
    Python3基础 __repr__ 类的实例对象的名字 可以打印文字(1)
  • 原文地址:https://www.cnblogs.com/flatcc/p/7599092.html
Copyright © 2011-2022 走看看