Windows API 和 C 运行时库之间有什么关系?

What is the relationship between the Windows API and the C run time library?

提问人:MainID 提问时间:1/8/2009 最后编辑:Andreas BoniniMainID 更新时间:2/23/2010 访问量:2696

问:

Windows API 和 C 运行时库之间有什么关系?

C winapi

评论

0赞 Pop Catalin 1/8/2009
你指的是什么 C 运行时库?(至少我知道没有这样的事情)。你是说 VC++ 运行时库?
0赞 Jason Coco 1/8/2009
@pop:有一个 C 运行时库。它包括平台支持的 C 标准所需的所有功能。
0赞 GEOCHET 1/8/2009
@Jason Coco:你比任何人都不知道OP是C还是C++。他说C并标记C++。他很有可能不知道C != C++。
0赞 Jason Coco 1/8/2009
@Rich B:当然,但无论如何,答案基本上是一样的。尽管如此,他在他的主题和问题中写了两次 C。C++ 首先在标签列表中弹出,如果您不熟悉 SO,很容易意外地选择第一个建议而不是您键入的建议。我仍然有它发生在我身上。
0赞 Pop Catalin 1/8/2009
@Jason Coco:我认为 C 标准库和“运行时库”是有区别的,C 标准库它不是运行时库,它完全由链接器静态链接到应用程序中,没有任何动态链接或绑定。

答:

8赞 Evan Teran 1/8/2009 #1

如果你指的是标准的 C 库(我假设是 msvcrt.dll)。然后就不多了。大多数 Windows API 是在单独的 dll 中实现的(其中大部分是在 user32.dll 或 kernel32.dll 中)。事实上,Windows API 中的一些函数只是围绕系统调用的精简包装器,其中实际工作是在内核本身中完成的。

此外,正如 ocdecio 所说,假设 C 标准库的某些部分是使用 Windows API 实现的,这是完全合理的。对于某些情况,例如字符串操作,反之亦然。

编辑:由于哪些dll是根据其他dll实现的,因此受到了质疑,我已经与Dependancy Walker进行了核对,这是我的发现:

kernel32.dll depends on:
  ntdll.dll

user32.dll depends on:
  gdi32.dll
  kernel32
  ntdll.dll
  advapi.dll
  msimg32.dll
  powerprof.dll (this dll references msvcrt.dll for some string functions)
  winsta.dll

msvcrt.dll depends on:
  kernel32.dll (yes it does have imports for CreateFileA)
  ntdll.dll

基于此,我相信 msvcrt 是建立在 win32 API 之上的。

评论

0赞 Evan Teran 1/8/2009
又投了反对票?反对者至少可以解释一下吗?我不相信我的答案是错误的。
0赞 Jason Coco 1/8/2009
我认为答案很好,所以+1...当人们在不发表评论的情况下对一个合理的答案投反对票时,我无法忍受。
0赞 MainID 1/8/2009
C 标准库和 C 运行时库有什么区别吗?
0赞 Johannes Schaub - litb 1/8/2009
里奇,为什么要为你“做”这个?我认为这是对的。fopen 可以很好地使用 OpenFile/CreateFile 实现
2赞 bk1e 1/11/2009
无需假设任何事情。CRT 源包含在 Visual C++ 中,是的,它使用 Win32 API 调用。
7赞 Jason Coco 1/8/2009 #2

简而言之:Windows API 包含专门为 Windows 定义的所有函数。C 运行时库包含标准 C 所需的所有函数。

实现这些功能的物理库可以是单个文件(库),也可以拆分为两个单独的库或拆分为多个库,具体取决于操作系统和您使用的实际 API/服务。

例如,在创建文件时,C 标准包括以下功能:

fopen

打开和创建文件等,而 Win32 API(例如)定义了以下功能:

CreateFile

创建和操作文件。第一个库在标准 C 运行时库可用的地方可用,而第二个库仅在支持 Win32 API 的 Windows 计算机上可用。

4赞 OJ. 1/8/2009 #3

Win32 是与 CRT 完全不同的野兽。

CRT 是使用 C 或 C++ 函数/特性(如 printf 或 cout)时需要链接到项目中的东西。

Win32 是一组库,在使用 Windows 功能(如 GetWindowText)时需要链接到项目中。

1赞 ChrisW 1/8/2009 #4

它们是什么:

  • Windows API 是由 Microsoft Windows[TM] 操作系统导出的 API
  • C 运行时库是编译器供应商随 C 编译器一起提供的“标准库”,可在编译器面向的任何/任何操作系统(例如 Unix)上使用

他们的关系是什么:

  • 它们是不同的,但都同样适用于在 Windows 上运行的 C++ 应用程序
  • 在 Windows 上,C 标准库是通过调用基础 Windows API(分配内存、打开文件等)来实现的。
-2赞 Mohan Narayanaswamy 1/8/2009 #5

Unix 系统调用类似于 Windows API。

评论

0赞 GEOCHET 1/8/2009
什么?这没有任何意义。
0赞 Johannes Schaub - litb 1/8/2009
丰富,我认为这确实意义有限:unix syscalls <=> windows API,msvcrt <=> glibc
0赞 dmityugov 1/8/2009 #6

C 运行时库基于 Windows API