农业资讯网
当前位置: 首页 农业百科

windows运行库合集(win10必备运行库)

时间:2023-05-24 作者: 小编 阅读量: 2 栏目名: 农业百科

Windows应用程序入口函数GUI(GraphicalUserInterface)应用,链接器选项:/SUBSYSTEM:WINDOWSCUI(ConsoleUserInterface)应用,链接器选项:/SUBSYSTEM:CONSOLE_tWinMain与_tmain函数声明IntWINAPI_tWinMain(HINSTANCEhInstanceExe,HINSTANCE,PTSTRpsz

Windows 应用程序入口函数

GUI(Graphical User Interface)应用,链接器选项:/SUBSYSTEM:WINDOWS

CUI(Console User Interface)应用,链接器选项:/SUBSYSTEM:CONSOLE

_tWinMain 与 _tmain 函数声明

Int WINAPI _tWinMain(HINSTANCE hInstanceExe,HINSTANCE,PTSTR pszCmdLine,int nCmdShow);int _tmain(int argc,TCHAR *argv[],TCHAR *envp[]);

Windows 的动态链接库(Dynamic-Link Library)

部分知识点来自《Windows 核心编程(第五版)》

用处

(1)扩展了应用程序的特性

(2)简化了项目管理

(3)有助于节省内存

(4)促进了资源的共享

(5)促进了本地化

(6)有助于解决平台间的差异

(7)可以用于特殊目的

注意

(1)创建 DLL,事实上是在创建可供一个可执行模块调用的函数

(2)当一个模块提供一个内存分配函数(malloc、new)的时候,它必须同时提供另一个内存释放函数(free、delete)

(3)在使用 C 和 C++ 混编的时候,要使用 extern “C” 修饰符

(4)一个 DLL 可以导出函数、变量(避免导出)、C++ 类(导出导入需要同编译器,否则避免导出)

(5)DLL 模块:cpp 文件中的 __declspec(dllexport) 写在 include 头文件之前

(6)调用 DLL 的可执行模块:cpp 文件的 __declspec(dllimport) 之前不应该定义 MYLIBAPI

加载 Windows 程序的搜索顺序

1、包含可执行文件的目录

2、Windows 的系统目录,可以通过 GetSystemDirectory 得到

3、16 位的系统目录,即 Windows 目录中的 System 子目录

4、Windows 目录,可以通过 GetWindowsDirectory 得到

5、进程的当前目录

6、PATH 环境变量中所列出的目录

DLL 入口函数

DllMain 函数

BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved){switch(fdwReason){case DLL_PROCESS_ATTACH:// 第一次将一个DLL映射到进程地址空间时调用// The DLL is being mapped into the process' address space.break;case DLL_THREAD_ATTACH:// 当进程创建一个线程的时候,用于告诉DLL执行与线程相关的初始化(非主线程执行)// A thread is bing created.break;case DLL_THREAD_DETACH:// 系统调用 ExitThread 线程退出前,即将终止的线程通过告诉DLL执行与线程相关的清理// A thread is exiting cleanly.break;case DLL_PROCESS_DETACH:// 将一个DLL从进程的地址空间时调用// The DLL is being unmapped from the process' address space.break;}return (TRUE); // Used only for DLL_PROCESS_ATTACH}

载入卸载库

LoadLibrary、LoadLibraryExA、LoadPackagedLibrary、FreeLibrary、FreeLibraryAndExitThread 函数声明

// 载入库HMODULE WINAPI LoadLibrary(_In_ LPCTSTR lpFileName);HMODULE LoadLibraryExA(LPCSTR lpLibFileName,HANDLE hFile,DWORDdwFlags);// 若要在通用 Windows 平台(UWP)应用中加载 Win32 DLL,需要调用 LoadPackagedLibrary,而不是 LoadLibrary 或 LoadLibraryExHMODULE LoadPackagedLibrary(LPCWSTR lpwLibFileName,DWORDReserved);// 卸载库BOOL WINAPI FreeLibrary(_In_ HMODULE hModule);// 卸载库和退出线程VOID WINAPI FreeLibraryAndExitThread(_In_ HMODULE hModule,_In_ DWORDdwExitCode);

显示地链接到导出符号

GetProcAddress 函数声明

FARPROC GetProcAddress(HMODULE hInstDll,PCSTR pszSymbolName// 只能接受 ANSI 字符串,不能是 Unicode);

DumpBin.exe 查看 DLL 信息

在 VS 的开发人员命令提示符 使用 DumpBin.exe 可查看 DLL 库的导出段(导出的变量、函数、类名的符号)、相对虚拟地址(RVA,relative virtual address)。如:

LoadLibrary 与 FreeLibrary 流程图

LoadLibrary 与 FreeLibrary 流程图

LoadLibrary

FreeLibrary

DLL 库的编写(导出一个 DLL 模块)

DLL 库的编写(导出一个 DLL 模块) DLL 头文件

// MyLib.h#ifdef MYLIBAPI// MYLIBAPI 应该在全部 DLL 源文件的 include "Mylib.h" 之前被定义// 全部函数/变量正在被导出#else// 这个头文件被一个exe源代码模块包含,意味着全部函数/变量被导入#define MYLIBAPI extern "C" __declspec(dllimport)#endif// 这里定义任何的数据结构和符号// 定义导出的变量(避免导出变量)MYLIBAPI int g_nResult;// 定义导出函数原型MYLIBAPI int Add(int nLeft, int nRight);

DLL 源文件

// MyLibFile1.cpp// 包含标准Windows和C运行时头文件#include <windows.h>// DLL源码文件导出的函数和变量#define MYLIBAPI extern "C" __declspec(dllexport)// 包含导出的数据结构、符号、函数、变量#include "MyLib.h"// 将此DLL源代码文件的代码放在此处int g_nResult;int Add(int nLeft, int nRight){g_nResult = nLeft + nRight;return g_nResult;}

DLL 库的使用(运行时动态链接 DLL)

DLL 库的使用(运行时动态链接 DLL)

// A simple program that uses LoadLibrary and // GetProcAddress to access myPuts from Myputs.dll.#include <windows.h> #include <stdio.h>typedef int (__cdecl *MYPROC)(LPWSTR);int main( void ) {HINSTANCE hinstLib;MYPROC ProcAdd;BOOL fFreeResult, fRunTimeLinkSuccess = FALSE;// Get a handle to the DLL module.hinstLib = LoadLibrary(TEXT("MyPuts.dll"));// If the handle is valid, try to get the function address.if (hinstLib != NULL){ProcAdd = (MYPROC) GetProcAddress(hinstLib, "myPuts");// If the function address is valid, call the function.if (NULL != ProcAdd){fRunTimeLinkSuccess = TRUE;(ProcAdd) (L"Message sent to the DLL functionn");}// Free the DLL module.fFreeResult = FreeLibrary(hinstLib);}// If unable to call the DLL function, use an alternative.if (! fRunTimeLinkSuccess)printf("Message printed from executablen");return 0;}

运行库(Runtime Library)

典型程序运行步骤

(1)操作系统创建进程,把控制权交给程序的入口(往往是运行库中的某个入口函数)

(2)入口函数对运行库和程序运行环境进行初始化(包括堆、I/O、线程、全局变量构造等等)。

(3)入口函数初始化后,调用 main 函数,正式开始执行程序主体部分。

(4)main 函数执行完毕后,返回到入口函数进行清理工作(包括全局变量析构、堆销毁、关闭I/O等),然后进行系统调用结束进程。

一个程序的 I/O 指代程序与外界的交互,包括文件、管程、网络、命令行、信号等。更广义地讲,I/O 指代操作系统理解为 “文件” 的事物。

glibc 入口

_start -> __libc_start_main -> exit -> _exit

其中 main(argc, argv, __environ) 函数在 __libc_start_main 里执行。

MSVC CRT 入口

int mainCRTStartup(void)

执行如下操作:

(1)初始化和 OS 版本有关的全局变量。

(2)初始化堆。

(3)初始化 I/O。

(4)获取命令行参数和环境变量。

(5)初始化 C 库的一些数据。

(6)调用 main 并记录返回值。

(7)检查错误并将 main 的返回值返回。

C 语言运行库(CRT)

大致包含如下功能:

启动与退出:包括入口函数及入口函数所依赖的其他函数等。

标准函数:有 C 语言标准规定的C语言标准库所拥有的函数实现。

I/O:I/O 功能的封装和实现。

堆:堆的封装和实现。

语言实现:语言中一些特殊功能的实现。

调试:实现调试功能的代码。

C语言标准库(ANSI C)

包含:

标准输入输出(stdio.h)

文件操作(stdio.h)

字符操作(ctype.h)

字符串操作(string.h)

数学函数(math.h)

资源管理(stdlib.h)

格式转换(stdlib.h)

时间/日期(time.h)

断言(assert.h)

各种类型上的常数(limits.h & float.h)

变长参数(stdarg.h)

非局部跳转(setjmp.h)

    推荐阅读
  • 山药怎么做脆(脆山药做法)

    我们一起去了解并探讨一下这个问题吧!山药去皮切片,胡萝卜也皮切片,一同放入热水里焯2分钟,然后放凉水冲洗干净。锅内放入适量的植物油,烧热后放入事先焯好的山药和胡萝卜,翻炒片刻。调入适量的盐,翻炒均匀,再加入适量的生粉水勾个薄欠炒均就可以装盘了。

  • 全球美术学校排名(合肥世界外国语学校)

    冬日清寒,风景这边独好!高中美术班自创办以来,从蹒跚起步到如今的花开校园,师资力量和生源质量的不断提升,发展的每步历程,无不透露出世外办学思路的睿智,教师团队的精诚。这棵嫩苗已茁壮成长起来,坚守着这个美丽的家园,不断创造出一个又一个辉煌!色彩靓丽中不失动感,素描骨感里透着清新,速写线条间流动着喜欢,设计理念时勾勒着梦幻!2019届高三美术班,精致而又温婉,才气内敛,执笔如仙,今日与君共赏!

  • 韭菜鸡蛋捞面条怎么做(韭菜鸡蛋捞面条的做法)

    跟着小编一起来看一看吧!韭菜鸡蛋捞面条怎么做主料:面条(生)200克。辅料:韭菜1把、鸡蛋2个、香油10克、盐2克、鸡精1克、醋适量。切好的韭菜和葱放入碗里,放入盐、鸡精备用。鸡蛋打入碗内搅散,锅内烧开水,倒入鸡蛋液。蛋液会立刻浮起来,看着全部凝固了熟了,用捞出来放到韭菜碗里。倒入适量的开水,盖上盖子焖一下。下入面条煮熟,捞出过冷水。搅匀,吃的时候把汤浇在面条上即可。

  • 脸色暗黄有斑怎么办月经不调(掉头发脸色差长斑是气血不足的表现)

    气的作用主要是温养机体和抵御外邪的入侵,同时参与脏腑功能的新陈代谢。气血不足的结果会导致脏腑功能的减退,引起早衰的病变。一旦气血不足时,首先人体会自动保证五脏的气血供应,从而减少对四肢末节的气血供应。黄芪有益气、固本,敛汗、生肌、利水、消水肿等功效。红枣可补中益气、养血安神,可用于脾胃气虚、血虚失眠多梦等症。做法:黄芪和当归以4:1的比例用量,红枣适量。黄芪当归红枣茶主要功效为补养气血。

  • 潮汕人在泰国排行(你知道自己与泰国人的)

    据一位西方学者估计,直至1830年,曼谷城50万居民中有40万为华侨,其中主要为潮汕人,甚至出现了“潮汕话是泰国第二语言”的说法。其中最有潮汕特色的当属大峰祖师。传说航海的人见林默身着红装飞翔在海上,救助遇难呼救的人,所以人们修建了供奉林默的庙宇,称之为妈祖庙。在出海前,船主会到妈祖庙中请香,以保佑自己航行顺利。妈祖并非起源于潮汕,但在宋元时期已经在潮汕流传开来,当地人民亲切叫其为七圣妈。

  • 梦幻西游三维版普陀山带什么宝宝(赶紧来看看)

    梦幻西游三维版普陀山带什么宝宝?梦幻西游三维版普陀山带这三个宝宝:小悟空—吸血鬼—孔雀妖/狂豹,现在小编就来说说关于梦幻西游三维版普陀山带什么宝宝?基本上前期都是用小悟空去升级的,是一个万金油类的宠物,谁让它好用呢,输出能力强啊,而且就算受伤了,普陀还给它加血啥的,根本不愁啊,所以还是非常厉害的。

  • 酸辣魔芋豆腐(需要准备哪些食材)

    酸辣魔芋豆腐食材:魔芋:400克;酸菜:200克;小米椒:1个;生姜:1块;芹菜:2根;香葱:1根;花椒:10粒;盐:1茶勺;鸡精:1茶勺;芝麻辣椒油:两勺;白糖:半勺;郫县豆瓣酱:1大勺;食用油:适量。酸菜洗净切细,芹菜、葱白、生姜切丝,葱切花,小米椒切圈。加入郫县豆瓣酱,提入半勺白糖炒香。下入酸菜及芹菜丝煮开,小火再焖煮10分钟。装盘后淋入芝麻辣椒油即可上桌开吃。

  • 洛氏硬度如何换算(什么是洛氏硬度)

    什么是洛氏硬度洛氏硬度RockwellHardness用锥顶角为120°的金刚石圆锥或Ø1.588mm和Ø3.176mm淬火钢球作压头和载荷配合使用,在10kgf初载荷和60、100或150kgf力总载荷(即初载荷。

  • 我们是亲兄弟原唱歌谱(我们是亲兄弟)

    接下来我们就一起去研究一下吧!我们是亲兄弟原唱歌谱游戏名:pvz95版注:95版土豆类爆炸范围是3*3格和樱桃炸弹一样!

  • 防暑冷饮三豆饮(食疗方三豆饮是怎么做的)

    我们一起去了解并探讨一下这个问题吧!防暑冷饮三豆饮材料:黑豆150克、绿豆150克、赤小豆150克、另外再加60克甘草,白糖适量。另一种是将三种豆洗净浸泡至涨后混合磨成浆,加水适量煮沸,以白糖调味饮服,每日2次,早晚服用,可长期食用。