为什么我们需要在Windows C ++中链接kernel32.dll,user32.dll等?

the_endian

为什么默认情况下,Visual Studio为什么包括kernel32.dll,user32,dll,winspool.lib等的其他依赖关系?

为什么这些资源需要链接到Windows上的C ++项目中,而实际上却变成了机器代码并直接插入每个可执行文件中,还是与可执行文件分开并在运行时在它们之间建立了链接?

迈克·纳基斯(Mike Nakis)

为了使C ++应用程序在Windows下运行,它至少需要一些系统服务。例如,它需要分配和释放内存,它需要获取被调用的命令行参数,并且它需要能够在完成后退出到操作系统。通常,它还需要以某种方式接收输入并产生输出,无论是通过GUI还是通过控制台,还是通过网络,或者仅仅是通过在文件系统上读写文件。

魔术没有提供这些服务;其中的每一个都由kernel32.dll,user32.dll等提供。

常见的误解是此功能由C和C ++的标准库提供。事实并非如此,因为如果是的话,那么这些库将能够执行魔术。标准库提供的服务是通过委派给主机系统的本机服务来实现的。

因此,当您调用时,例如malloc()Windows的标准C / C ++库将在内部调用GlobalAlloc()(在Kernel32.dll中实现),而MacOS的标准C / C ++库将在内部调用vm_allocate()或类似的东西。理解这一点非常重要:对于每个不同的主机系统,都有一个不同的标准库实现,这些实现利用了该主机系统的本机服务。

标准库的好处在于它们建立了一个众所周知的通用接口,您的C / C ++代码可以期望使用该接口,因此您的C / C ++代码不必确切地知道也不担心。它在哪个主机系统上运行。

在Windows下,您的程序未完全与DLL链接,因为链接是创建可执行文件的过程,而DLL仅在运行时起作用。您的程序与库链接,因此对于每个DLL通常都有一个对应的LIB。例如,对于Kernel32.DLL,存在Kernel32.LIB,因此您的程序将与Kernel32.LIB链接。

这些LIB很小,因为它们不包含实际的代码。程序运行时,Kernel32.LIB的作用是要求存在相应的Kernel32.DLL,它要求操作系统加载Kernel32.DLL(要求将其映射到进程的内存空间的可能性更大, (因为通常已经加载了Kernel32.DLL),然后它将每个单个库调用重定向到DLL的相应入口点。

因此,是的,每个C ++程序都需要使用这些DLL,否,它不会完全链接DLL本身,它仅链接相应的LIB,然后将调用委托给DLL,而LIB很小,所以不要不用担心他们。

请注意,从理论上讲,有可能编写一个自包含的程序,不需要任何这些DLL,但是这样的程序实际上将无法执行任何操作:加载后,它将被限制为不执行任何操作,而只能执行以下操作:自己进行内省性思考,无法接收任何输入,也不产生任何输出。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在Go中调用kernel32的ReadProcessMemory

来自分类Dev

为什么我们需要C ++中的虚函数?

来自分类Dev

在Nano Server上运行ASP.NET 5会引发“无法加载DLL'kernel32'”

来自分类Dev

user32.dll。我如何找到文本框?

来自分类Dev

为什么我们需要在C#中锁定并反对?

来自分类Dev

为什么我的C#DLL中的方法丢失了?

来自分类Dev

python ctypes,使用参数调用user32和kernel32 func

来自分类Dev

我们可以将C ++ dll直接集成到离子框架中吗

来自分类Dev

在Eclipse中以C ++链接Windows中的.lib并使用.dll

来自分类Dev

将DLL链接到ac#项目时找不到kernel32的InterlockedExchange方法

来自分类Dev

需要修复此错误:“在kernel32中找不到DLL入口点GetSystemInfo”

来自分类Dev

C中的Windows DLL注入器不会注入DLL

来自分类Dev

LoadLibraryExW无法加载User32.dll

来自分类Dev

Windows-如何链接到API集(* ms-win *)而不是kernel32.dll,ntdll.dll等?

来自分类Dev

为什么我需要WaitFor'/ MsgBox以防止在从C ++ DLL获取数据的VB6 exe中崩溃

来自分类Dev

C ++-Win32 DLL中的LoadString()无法正常工作

来自分类Dev

无法加载模块DLL C:\ WINDOWS \ system32 \ inetsrv \ rewrite.dll

来自分类Dev

为什么user32.dll中的断点无法中断另一个进程

来自分类Dev

是否每个Windows都带有user32.dll?

来自分类Dev

我们的c ++ DLL的代码部分在Windows 7 SP1上崩溃了

来自分类Dev

为什么我们需要在此脚本中调用“ c.set.bind(c)”?

来自分类Dev

为什么我的程序终止调用KERNEL32!FileTimeToSystemTime()?

来自分类Dev

安装到{sys}的文件/ DLL没有出现在C:\ Windows \ system32中

来自分类Dev

C#程序AccessViolationException中的Win32 DLL

来自分类Dev

user32.dll CallNextHookEx - hhk 参数 - 已弃用?需要什么操作系统?

来自分类Dev

来自 kernel32 的 vba dll 调用 writefile 创建巨大的文件

来自分类Dev

需要在 Java 中引用和使用 C# dll

来自分类Dev

需要QtWebEngine 32位dll

来自分类Dev

为什么我们需要在 C++20 中的函数概念参数之后使用 auto?

Related 相关文章

  1. 1

    在Go中调用kernel32的ReadProcessMemory

  2. 2

    为什么我们需要C ++中的虚函数?

  3. 3

    在Nano Server上运行ASP.NET 5会引发“无法加载DLL'kernel32'”

  4. 4

    user32.dll。我如何找到文本框?

  5. 5

    为什么我们需要在C#中锁定并反对?

  6. 6

    为什么我的C#DLL中的方法丢失了?

  7. 7

    python ctypes,使用参数调用user32和kernel32 func

  8. 8

    我们可以将C ++ dll直接集成到离子框架中吗

  9. 9

    在Eclipse中以C ++链接Windows中的.lib并使用.dll

  10. 10

    将DLL链接到ac#项目时找不到kernel32的InterlockedExchange方法

  11. 11

    需要修复此错误:“在kernel32中找不到DLL入口点GetSystemInfo”

  12. 12

    C中的Windows DLL注入器不会注入DLL

  13. 13

    LoadLibraryExW无法加载User32.dll

  14. 14

    Windows-如何链接到API集(* ms-win *)而不是kernel32.dll,ntdll.dll等?

  15. 15

    为什么我需要WaitFor'/ MsgBox以防止在从C ++ DLL获取数据的VB6 exe中崩溃

  16. 16

    C ++-Win32 DLL中的LoadString()无法正常工作

  17. 17

    无法加载模块DLL C:\ WINDOWS \ system32 \ inetsrv \ rewrite.dll

  18. 18

    为什么user32.dll中的断点无法中断另一个进程

  19. 19

    是否每个Windows都带有user32.dll?

  20. 20

    我们的c ++ DLL的代码部分在Windows 7 SP1上崩溃了

  21. 21

    为什么我们需要在此脚本中调用“ c.set.bind(c)”?

  22. 22

    为什么我的程序终止调用KERNEL32!FileTimeToSystemTime()?

  23. 23

    安装到{sys}的文件/ DLL没有出现在C:\ Windows \ system32中

  24. 24

    C#程序AccessViolationException中的Win32 DLL

  25. 25

    user32.dll CallNextHookEx - hhk 参数 - 已弃用?需要什么操作系统?

  26. 26

    来自 kernel32 的 vba dll 调用 writefile 创建巨大的文件

  27. 27

    需要在 Java 中引用和使用 C# dll

  28. 28

    需要QtWebEngine 32位dll

  29. 29

    为什么我们需要在 C++20 中的函数概念参数之后使用 auto?

热门标签

归档