windows运行库合集(win10必备运行库)
多条告白如次剧本只需引入一次
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, DWORD dwFlags);// 若要在通用 Windows 平台(UWP)运用中加载 Win32 DLL,须要挪用 LoadPackagedLibrary,而不是 LoadLibrary 或 LoadLibraryExHMODULE LoadPackagedLibrary( LPCWSTR lpwLibFileName, DWORD Reserved);// 卸载库BOOL WINAPI FreeLibrary( _In_ HMODULE hModule);// 卸载库和退出线程VOID WINAPI FreeLibraryAndExitThread( _In_ HMODULE hModule, _In_ DWORD dwExitCode);表露地链接到导出标记
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)