多条告白如次剧本只需引入一次
Windows运用步调进口因变量
GUI(GraphicalUserInterface)运用,链接器选项:/SUBSYSTEM:WINDOWS
CUI(ConsoleUserInterface)运用,链接器选项:/SUBSYSTEM:CONSOLE
_tWinMain与_tmain因变量证明
IntWINAPI_tWinMain(HINSTANCEhInstanceExe,HINSTANCE,PTSTRpszCmdLine,intnCmdShow);int_tmain(intargc,TCHAR*argv[],TCHAR*envp[]);Windows的动静链接库(Dynamic-LinkLibrary)
局部常识点来自《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因变量
BOOLWINAPIDllMain(HINSTANCEhinstDLL,DWORDfdwReason,LPVOIDlpvReserved){switch(fdwReason){caseDLL_PROCESS_ATTACH://第一次将一个DLL映照到过程地方空间时挪用//TheDLLisbeingmappedintotheprocess'addressspace.break;caseDLL_THREAD_ATTACH://当过程创造一个线程的功夫,用来报告DLL实行与线程关系的初始化(非干线程实行)//Athreadisbingcreated.break;caseDLL_THREAD_DETACH://体例挪用ExitThread线程退出前,行将中断的线程经过报告DLL实行与线程关系的整理//Athreadisexitingcleanly.break;caseDLL_PROCESS_DETACH://将一个DLL从过程的地方空间时挪用//TheDLLisbeingunmappedfromtheprocess'addressspace.break;}return(TRUE);//UsedonlyforDLL_PROCESS_ATTACH}载入卸载库
LoadLibrary、LoadLibraryExA、LoadPackagedLibrary、FreeLibrary、FreeLibraryAndExitThread因变量证明
//载入库HMODULEWINAPILoadLibrary(_In_LPCTSTRlpFileName);HMODULELoadLibraryExA(LPCSTRlpLibFileName,HANDLEhFile,DWORDdwFlags);//若要在通用Windows平台(UWP)运用中加载Win32DLL,须要挪用LoadPackagedLibrary,而不是LoadLibrary或LoadLibraryExHMODULELoadPackagedLibrary(LPCWSTRlpwLibFileName,DWORDReserved);//卸载库BOOLWINAPIFreeLibrary(_In_HMODULEhModule);//卸载库和退出线程VOIDWINAPIFreeLibraryAndExitThread(_In_HMODULEhModule,_In_DWORDdwExitCode);表露地链接到导出标记
GetProcAddress因变量证明
FARPROCGetProcAddress(HMODULEhInstDll,PCSTRpszSymbolName//只能接收ANSI字符串,不许是Unicode);DumpBin.exe察看DLL消息
在VS的开拓职员吩咐提醒符运用DumpBin.exe可察看DLL库的导出段(导出的变量、因变量、类名的标记)、对立假造地方(RVA,relativevirtualaddress)。如:
LoadLibrary与FreeLibrary过程图
LoadLibrary与FreeLibrary过程图
LoadLibrary
FreeLibrary
DLL库的编写(导出一个DLL模块)
DLL库的编写(导出一个DLL模块)DLL头文献
//MyLib.h#ifdefMYLIBAPI//MYLIBAPI该当在十足DLL源文献的include"Mylib.h"之前被设置//十足因变量/变量正在被导出#else//这个儿文献被一个exe源代码模块包括,表示着十足因变量/变量被导出#defineMYLIBAPIextern"C"__declspec(dllimport)#endif//这边设置任何的数据构造和标记//设置导出的变量(制止导出变量)MYLIBAPIintg_nResult;//设置导出因变量原形MYLIBAPIintAdd(intnLeft,intnRight);DLL源文献
//MyLibFile1.cpp//包括规范Windows和C运转时头文献#include<windows.h>//DLL源码文献导出的因变量和变量#defineMYLIBAPIextern"C"__declspec(dllexport)//包括导出的数据构造、标记、因变量、变量#include"MyLib.h"//将此DLL源代码文献的代码放在此处intg_nResult;intAdd(intnLeft,intnRight){g_nResult=nLeft+nRight;returng_nResult;}DLL库的运用(运转时动静链接DLL)
DLL库的运用(运转时动静链接DLL)
//AsimpleprogramthatusesLoadLibraryand//GetProcAddresstoaccessmyPutsfromMyputs.dll.#include<windows.h>#include<stdio.h>typedefint(__cdecl*MYPROC)(LPWSTR);intmain(void){HINSTANCEhinstLib;MYPROCProcAdd;BOOLfFreeResult,fRunTimeLinkSuccess=FALSE;//GetahandletotheDLLmodule.hinstLib=LoadLibrary(TEXT("MyPuts.dll"));//Ifthehandleisvalid,trytogetthefunctionaddress.if(hinstLib!=NULL){ProcAdd=(MYPROC)GetProcAddress(hinstLib,"myPuts");//Ifthefunctionaddressisvalid,callthefunction.if(NULL!=ProcAdd){fRunTimeLinkSuccess=TRUE;(ProcAdd)(L"MessagesenttotheDLLfunctionn");}//FreetheDLLmodule.fFreeResult=FreeLibrary(hinstLib);}//IfunabletocalltheDLLfunction,useanalternative.if(!fRunTimeLinkSuccess)printf("Messageprintedfromexecutablen");return0;}运转库(RuntimeLibrary)
典范步调运转办法
(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里实行。
MSVCCRT进口
intmainCRTStartup(void)
实行如次操纵:
(1)初始化和OS本子相关的全部变量。
(2)初始化堆。
(3)初始化I/O。
(4)获得吩咐行参数和情况变量。
(5)初始化C库的少许数据。
(6)挪用main并记载归来值。
(7)查看缺点并将main的归来值归来。
C谈话运转库(CRT)
大概包括如次功效:
启用与退出:囊括进口因变量及进口因变量所依附的其余因变量等。
规范因变量:有C谈话规范规则的C谈话规范库所具有的因变量实行。
I/O:I/O功效的封装和实行。
堆:堆的封装和实行。
谈话实行:谈话中少许特出功效的实行。
调节和测试:实行调节和测试功效的代码。
C谈话规范库(ANSIC)
包括:
规范输出输入(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)