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

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)

    推荐阅读
  • 奥迪被男孩儿划伤家长赔了3500(反转10岁男孩划伤)

    楚天都市报记者:刘闪近日,重庆沙坪坝区石井坡一辆奥迪车被划,车主报警后发现一位10岁男孩有“最大嫌疑”,男孩家长向车主赔偿了3500元。邹兴华:10月7日下午2点多,车主王先生报警反映,他的车被划了。鉴于孩子是未成年,我们将当事双方带回派出所进行调解。最终,由刘先生赔偿车主王先生车辆修理费用3500元。能够不把孩子的情绪当小事,不把孩子的自尊当小事,邹警官不仅是优秀的警察,也是优秀的“大人”。

  • 索的组词(索的组词有哪些)

    下面希望有你要的答案,我们一起来看看吧!索的组词索的组词:离群索居、勒索、搜索、索性、不假思索、按图索骥、搜索枯肠、敲诈勒索、线索、摸索、索取、索要、智尽能索、探赜索隐、兴味索然扥。索是一个汉字,读作suǒ,本意是指绳子,搜寻,讨要,毫无,单独等引申义是。

  • 谷歌seo实例详解(外贸自建站Google排名上不去)

    在做外贸网站时,我们很容易遇到排名不再上升的时期,其实谷歌优化主要也是做好几个内容,做好细节。2,GPB外链服务做谷歌优化外链是必不可少的,尤其是优质的GPB外链,如果自己不专业,最好是请人做好这一块。你像现在非常好的GPB外链,效果是很不错的。

  • r11s深度评测oppo(测评OPPOR11究竟好在哪儿)

    据调查机构消息,2016年OPPO挤进了国产手机的前三名。R9系列产品更是销量突破2000万台,在国内那可谓是傲视群雄,成为了年度最佳。然而机身背面和iPhone7Plus超高相似度在网络上形成了几乎一面倒的差评。但不可否认是,在抄袭iPhone7Plus设计的同时,OPPO还是做出了显著的进步。显示方面,5.5英寸1080p分辨率的AMOLED屏幕正是能够做到轻薄机身的基础。

  • 纸上谈兵主人公(单刀赴会的主人公是谁)

    赵括之所以出名,是因为长平之战前夕,赵王中了秦国的离间计,临时撤换了廉颇,派赵括出战。那时候,东方的魏、齐等国相继衰弱,赵国成为有可能对抗秦国的唯一一股力量。一气之下,赵奢斩杀了平原君家的九个管家,以示惩戒。当时,廉颇和乐乘都认为道路艰险,救援难度大,不应出兵。恃才而骄、不重实际让赵奢对这个儿子的担心日益加重。赵括要用行动证明自己并不是只会纸上谈兵。

  • 女人善良优雅经典句子(这些都合适摘录)

    女人善良优雅经典句子红尘中,你想做与众不同的时尚女人吗?那份独到的韵味,当然需要一款清新淡雅的饰品来点缀属于你的风情。一种是太阳,一种是你努力的模样!清澈明亮的瞳孔,弯弯的柳眉,长长的睫毛微微地颤动着,白皙无瑕的皮肤透出淡淡红粉,薄薄的双唇如玫瑰花瓣娇嫩欲滴。女人,越是处在逆境的时候,越要把背梁骨挺得直直的,脸上始终持着明亮的笑容,身上穿上合体的衣服,在人生的舞台上展示自我顽强的魅力。

  • 灭蚊灯灭蚊到底有没有效果(灭蚊灯管用吗要知道)

    我们看到灭蚊灯的一些宣传上,商家打的都是紫外线来灭蚊这种宣传语,权威部门已经做出结论,紫外线灭蚊其实是一个笑话。你还会相信紫外线灭蚊能有效吗?说了这么多,其实就是想告诉大家,虽然紫外线灭蚊灯没有什么效果,但是市面上其它的一些物理性的灭蚊灯,还是有一定效果的。

  • 战疫必胜全靠自我(并肩战疫守望相助)

    截至2月25日,江西省已累计派出9批11支医疗队,共计1233名队员投入到支援湖北疫情防治工作中。截至2月25日,江西援随医疗队接管12个病区,累计管理患者526例,其中疑似患者46例,确诊患者480例,累计重症患者25例,危重症患者39例;累计出院患者235例,其中疑似患者出院46例。2月14日,一则暖心的消息刷屏网络:江西援随医疗队接生疫情期间首例新生儿。而这也是疫情期间江西医疗队帮助湖北接生的第一个新生儿。

  • 巧克力怎么吃(正确吃巧克力的技巧)

    下面希望有你要的答案,我们一起来看看吧!巧克力怎么吃吃巧克力后可以再来一杯红茶,餐后3小时左右吃上两块巧克力能快速缓解饥饿感,也可以补充能量。但巧克力毕竟是高营养食品,应该把它当作日常饮食中的一部分而不是额外的零食,以免热量超标,感到饥饿又没有时间吃饭时可以吃几小块黑巧克力。

  • 洗衣机哪个品牌最好最实用(洗衣机十大排名)

    空气阻尼吊杆能够减少碰撞降低噪音,改善了波轮洗衣机噪音大的缺陷,过滤网能够将毛绒脏污一网打尽,避免了二次污染,同时延长了洗衣机寿命。桶自洁程序让机器可以自动清洁内外桶壁的污垢,避免了二次污染。