当前 Windows 版本中的 Win32 API 是不是仍然“原生”?

Posted

技术标签:

【中文标题】当前 Windows 版本中的 Win32 API 是不是仍然“原生”?【英文标题】:Is the Win32 API still "native" in current windows versions?当前 Windows 版本中的 Win32 API 是否仍然“原生”? 【发布时间】:2010-10-24 11:58:20 【问题描述】:

如果我的程序主要使用 win32 API,我的 API 调用是否在 Windows XP/Vista/7 中被模拟?

【问题讨论】:

【参考方案1】:

它下面有 Windows NT 内核,原生 NT 应用程序使用(大部分未记录的)NT API 与之交互。

csrss.exe,“客户端/服务器运行时子系统”,是一个提供用户模式 ​​Win32 子系统的原生 NT 应用程序,win32k.sys 提供内核模式 Win32 子系统。如果不加载这两个,Win32 应用程序将无法运行。

smss.exe,“会话管理子系统”,是启动期间要执行的第一个应用程序。作为其任务之一,它启动 Win32 子系统。

您认为什么是“原生”?内核根本不理解 Win32——所有 Win32 API 调用都由运行时和csrss 处理,最终归结为 NT API 调用。但是,如果没有 Win32 子系统,您将永远无法运行 Windows。


还存在用于 Windows 的 OS/2 和 POSIX 子系统。我不相信它们是常用的。


如果您熟悉 UNIX,这里有一个粗略的类比:syslog(3) 是原生 API 吗?

POSIX 要求其存在。它可能由libc 运行时库实现为“连接到套接字/管道并发送消息”。除非syslogd 守护程序正在运行,否则这将无法工作。 syslogd 守护进程由 init 脚本启动。

这不是一个完美的类比;许多应用程序不依赖于syslog(3),通常可以停止和重新启动syslogd 守护程序而不会对系统的操作产生不利影响(与csrss.exe 非常不同)。

【讨论】:

谢谢,对我很有教育意义。这个问题是由于我对 .NET 和“旧”win32 API 之间的关系感到困惑。我正在考虑使用 c++ 和 win32 编写新的应用程序,并希望确保我没有使用仅仅为了向后兼容而支持的 API。 Microsoft 的 .NET 实现位于 Win32 之上。从理论上讲,这可能会改变;但是,我怀疑它永远不会发生。即便如此,微软仍将继续永远支持 Win32 API —— 即使 Win16 API 仍然有效,这要归功于 wow32.dll (Windows-on-Windows-32)。 @ephemient:我开始质疑:- 看来他们相信未来在 .Net 和 CLR 中。 - VS2010 将基于 WPF 和 MEF。 - 研究奇点 (research.microsoft.com/en-us/projects/singularity) 等项目。 - Win7 有 XP 模式。什么时候 Win32 会成为传统模式,就像 OS X 出现时 Mac OS X 支持 Classic 一样受到支持? @seane:新的未来是现在的 Windows 运行时,它是一个原生的、基于 COM 的 Windows API 包装器。随着这一举措,现在有两个系统在 Win32 之上运行:.NET 和 WinRT。这降低了 Win32 被弃用的可能性。【参考方案2】:

Jared 对命名的看法。不确定这是否是您所得到的,但如果您在 64 位操作系统上运行 32 位进程,则有一个仿真(或“thunking”)层允许它们运行。这适用于所有 64 位版本的 Windows。

【讨论】:

在 32 位 Windows 上运行 16 位应用程序的 VDM 也使用 thunk 将 Win16 调用转换为 Win32 调用。它不是真正的仿真,而是一种有助于在其他不兼容的 16 位和 32 位环境之间转发呼叫的技术。 MIPS 和 Alpha 上的 Windows 具有运行 16 位 x86 应用程序的真实仿真,但这在 x86 上的 Windows 中既不需要也不存在。【参考方案3】:

没有。 Win32 API 有点名不副实。它可能应该被命名为 Windows API。除非您的代码实际上在其中一种仿真模式下运行,否则它不会被仿真。

【讨论】:

它是 Win32,因为 Windows API 已经作为 16 位存在。 Win16 最初被命名为“Windows API”;在引入 32 位 Windows 时,Win16 和 Win32 名称的出现是因为存在显着差异,但微软在提及 Win32(和源级兼容的 Win64)时经常使用名称“Windows API”。跨度>

以上是关于当前 Windows 版本中的 Win32 API 是不是仍然“原生”?的主要内容,如果未能解决你的问题,请参考以下文章

如何在运行时检查 Win32 中的 windows 版本?

WIN32是啥啊

Python调用windows API实现屏幕截图

通过PEB遍历当前进程中的模块(C语言实现)

Win32API:如何向父窗口请求嵌入式 Windows 事件通知

C++ 中的哪个 Windows API 将帮助我识别当前 ComboBox 正在使用哪个对话框类?