首页 > 编程知识 正文

c 基本语法(c语言语法基础知识)

时间:2023-05-04 20:10:27 阅读:71 作者:3594

00-1010图形用户界面应用程序,链接器选项:/SUBSYSTEM:WINDOWS

CUI(控制台用户界面)应用程序,链接器选项:/SUBSYSTEM:CONSOLE

_tWinMain和_tmain函数声明

Int WINAPI _tWinMain(

HINSTANCE hInstanceExe,

HINSTANCE,

PTSTR pszCmdLine,

int nCmdShow);

int _tmain(

int argc,

TCHAR *argv[],

TCHAR * envp[]);

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

Windows 应用程序入口函数

(1)扩展了应用程序的功能。

(2)简化项目管理

(3)有助于节省内存。

(4)促进资源共享。

(5)推进本土化。

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

(7)可用于特殊用途。

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

(1)创建DLL实际上是创建一个可执行模块可以调用的函数。

(2)当一个模块提供内存分配功能(malloc,new)时,它还必须提供另一个内存释放功能(free,delete)。

(3)使用C和C时,使用外部“C”修饰语。

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

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

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

00-1010 1.包含可执行文件的目录

2.Windows的系统目录可以通过GetSystemDirectory获取。

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

4.Windows目录,可以通过GetWindowsDirectory获取。

5.进程的当前目录

6.路径环境变量中列出的目录

用处

DllMain功能

BOOL WINAPI dll main(HINSTATION hinstDLL,DWORD fdwReason,LPVOID lpvReserved)

{

交换机

{

案例DLL_PROCESS_ATTACH:

//首次将DLL映射到进程地址空间时调用

DLL正在映射到进程的地址空间。

打破;

案例动态链接库_线程_附件:

//进程创建线程时,用来告诉DLL执行与线程相关的初始化(非主线程执行)。

//创建了一个线程。

打破;

案例DLL_THREAD_DETACH:

//在系统调用ExitThread线程退出之前,将被终止的线程会告诉DLL执行与线程相关的清理。

//线程正在干净地退出。

打破;

案例DLL_PROCESS_DETACH:

//从进程的地址空间中移除DLL时调用。

//正在从进程的地址空间中取消DLL的映射。

打破;

}

返回(真);//

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 或 LoadLibraryEx HMODULE 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)


今天的分享就到这里了,大家要好好学C++哟~

写在最后:对于准备学习C/C++编程的小伙伴,如果你想更好的提升你的编程核心能力(内功)不妨从现在开始!

编程学习书籍分享:

编程学习视频分享:

整理分享(多年学习的源码、项目实战视频、项目笔记,基础入门教程)

欢迎转行和学习编程的伙伴,利用更多的资料学习成长比自己琢磨更快哦!

对于C/C++感兴趣可以关注小编在后台私信我:【编程交流】一起来学习哦!可以领取一些C/C++的项目学习视频资料哦!已经设置好了关键词自动回复,自动领取就好了!

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。