首页 > 其他分享 >P48静态链接库-动态链接库

P48静态链接库-动态链接库

时间:2023-05-08 18:23:48浏览次数:33  
标签:__ return int xxx 链接库 declspec stdcall P48 动态链接库

静态编译:
优点:
实现代码的重复使用 方便
缺点:
将二进制代码直接编译到exe中 反汇编无法识别
使用静态链接生成的可执行文件体积较大,造成浪费

我们常用的printf、memcpy、strcpy等就来自这种静态库

静态链接库的代码在lib中 而动态链接库的代码在dll里面

创建静态链接库:
1、在VC6中创建项目:Win32 Static Library
2、在项目中创建两个文件:xxx.h 和 xxx.cpp

xxx.h文件:

#if !defined(AFX_TEST_H__DB32E837_3E66_4BE7_B873_C079BC621AF0__INCLUDED_)
#define AFX_TEST_H__DB32E837_3E66_4BE7_B873_C079BC621AF0__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

int Plus(int x, int y);
int Sub(int x, int y);
int Mul(int x, int y);
int Div(int x, int y);

#endif

  

xxx.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、编译

二、使用静态链接库:

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

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


一、创建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)告诉编译器此函数为导出函数;

二、使用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、避免在无意中进行运算


联合体:
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、使用序号导出的好处:
名字是一段程序就精华的注释,通过名字可以直接猜测到函数的功能
通过使用序号,可以达到隐藏的目的.

标签:__,return,int,xxx,链接库,declspec,stdcall,P48,动态链接库
From: https://www.cnblogs.com/cspecialr/p/17382751.html

相关文章

  • MFC-GetProcAddress获取动态链接库中函数的地址
     HMODULEhmodule=::GetModuleHandle(_T("kernel32.dll"));//获取动态链接库的模块句柄typedefDWORD(*p)(void);//声明函数指针数据类型charch[]="GetCurrentThreadId";//【特别注意:这个函数名必须是ANSI的char类型】pf=(p):......
  • MFC-GetModuleHandle获取动态链接库的模块句柄
     HMODULEhmodule=::GetModuleHandle(_T("kernel32.dll"));//获取动态链接库的模块句柄/*参数:LPCTSTR指向含有模块名称字符串的指针返回值:HMODULE,如执行成功成功,则返回模块句柄。零表示失败。获取错误信息*/     ......
  • 洛谷P4824题解
    题面题意:给出字符串s和t,每次操作将s中出现的第一个t删去,直到不能删为止。求最后的串。|s|<=1e6题解:hash做法。(此题也有kmp和权值线段树做法)因为涉及到删除操作,所以我们要动态的实现这个过程。所以考虑开一个栈来存储当前留下的字符。然后每有一个字符入栈,就拿当前......
  • P4870 [BalticOI 2009 Day1]甲虫
    题意:有一只甲虫处于一根水平的树枝。因为他沉迷数学无法自拔,所以他觉得很像是在\(x\)轴上。在同一根树枝上,还有\(n\)滴露水。每滴露水占用\(m\)个单位的水分。相对于甲虫的位置,他们的坐标分别是\(x_1,x_2,\dots,x_n\)。显然,这一天将会骄阳似火。每过一个时间单位,就会有......
  • elf文件格式与动态链接库(非常之好)-----不可不看
                elf文件格式与动态链接库(非常之好)-----不可不看机器执行的是机器指令,而机器指令就是一堆二进制的数字。高级语言编写的程序之所以可以在不同的机器上移植就因为有为不同机器设计的编译器的存在。高级语言的编译器就是把高级语言写的程序转换成某个......
  • 厉害了,Python也能使用动态链接库
    今日鸡汤未谙姑食性,先遣小姑尝。大家好,我是Python进阶者。前言动态链接库(DLL)想必大家都不陌生了吧,C/C++编程经常会用到,那么,它跟我们的Python有什么关系?要说关系恐怕也就是Python是用C写的了,不过,还有一点更重要的关系,那就是Python可以调用C函数,这一点,在Pywin32中有所体现。下面我......
  • 链接库
    一.认识链接库1.1库计算机中,有些文件专门用于存储可以重复使用的代码块,例如功能实用的函数或者类,我们通常将它们称为库文件,简称“库”(Library)。以C语言为例,如下为大家展示的就是一个函数库://Math.cintadd(inta,intb){returna+b;}intsub(inta,intb){......
  • 【题解】P4898 [IOI2018] seats 排座位
    思路线段树。题意可以转化成每次判定有多少个前缀满足所有结点构成矩形。首先排除确定矩阵坐标再数答案的做法,因为太难。所以考虑如何对前缀进行判定。一个简单的想法是维护前\(i\)个点中\(x,y\)坐标的最值,但这样只能暴力看矩阵中的所有元素,跑得很慢。不妨思考一下合法......
  • Windows 下 JNA 调用动态链接库 dll
    1.创建动态链接库项目创建jnaTest项目下一步中填写项目名称和存储的目录;然后直接创建即可创建结果2.定义头文件#pragmaonce#ifndefJNA_TEST_H#defineJNA_TEST_H#ifdef......
  • Windows 下 JNA 调用动态链接库 dll
    1.创建动态链接库项目创建jnaTest项目下一步中填写项目名称和存储的目录;然后直接创建即可创建结果2.定义头文件#pragmaonce#ifndefJNA_TEST_H#defineJNA......