所有基于Windows的程序都使用Windows API吗?没有它,程序是如何制作的?

时间:2012-07-24 17:55:40

标签: windows api dll assembly operating-system

我已经编程了几年,我知道如何使用预先存在的/标准库创建自己的复杂方法。我总是想知道(例如Java)在Java中创建JFrame对象时如何创建JFrame?如何使用标准代码(无库)来编写GUI或复杂的操作,如创建文件,读取文件等。

如果我们使用的所有这些现有方法都可以与我们用于构建金字塔的构建块进行比较。这些块是如何创建的? (我的意思是技术上)。没有标准库的编程语言是变量,循环和数学(甚至数学函数都是由某人创建的)。

基本问题是Java或C或任何其他语言(例如在Windows上运行时)通过调用Windows .dll库来创建窗口和其他复杂操作来完成所有操作吗?

如果是这样,那么在操作系统中如何使用常规变量,循环等创建这些复杂的操作/方法/函数。

我对编程的理解存在差距。 我理解计算机读取二进制(电=开/关),有人制作汇编/汇编程序,将二进制转换为更易读的代码,从处理器中的不同寄存器移动数字,这可以导致基本的数学运算,加法运算,减法运算,乘法运算,分数运算。我理解的差距是从大会跳到像C这样的高级语言,它保存变量,循环,创建GUIS,操作系统。

2 个答案:

答案 0 :(得分:2)

我试图在这里(非常)粗略说明AFAIK

  • 硬件 =如果用他们的语言指示他们可以做事情,即电脉冲形式的1和0流(电压高/低);
  • 总线/网络 =供应/携带这些电脉冲
  • 控制单元<​​/ strong> =驻留在CPU中的一个重要硬件控制总线以路由信号/脉冲
  • 指令(机器代码) =控制单元可以理解的1和0流;这是由谁制造它预先确定的;这可以告诉控制单元如何使用CPU寄存器,存储器和I / O设备(即计算机硬件)
  • 进程 =驻留在内存中的指令集
  • 操作系统 =可以访问硬件的进程集,可以使用对现有进程的系统调用创建新进程。 Syscalls是最终被转换为机器代码的人类可读指令
  • 目标文件/二进制文件/可执行文件 =当进程不在内存中而没有执行但驻留在磁盘中时; CPU指示BIOS查找OS加载器,引导加载程序启动母进程启动操作系统,母进程从驻留在磁盘中的(内核)对象文件生成其他进程
  • 汇编程序 =从汇编代码生成目标代码(文件);汇编代码是指令的直接人类可读形式,用于存储,加载CPU寄存器和存储器,写入/发送信号到各种I / O设备
  • 编译器/解释器等。 =最终将更高级别的语言转换为指令(变量存储在内存中,循环转换为从内存中的一个位置到另一个位置的跳转,如果您有兴趣看一下使用gcc -S source.c -o assembly.s
  • 从简单的C程序生成的汇编代码
  • 程序(源代码) =人类和编译器都理解的语言
  • 驱动程序 =用于与硬件通信的程序,它们生成这样的目标代码,其中包含处理特定硬件所需的指令;专有硬件不会泄露它的说明,所以你必须下载它们的二进制文件
  • 库/ API =存储在磁盘上的一段目标代码/编译器可理解代码,因此每次编写程序时都不需要重新发明轮子

因此,当您从Java创建GUI时,它实际上是要求您的窗口管理器以“绘制一个20x20矩形,角为圆形,半径为5px ”的形式创建GUI,通过它的本机方法调用,窗口管理器将此请求转发给操作系统进程,通过驱动程序将相应的指令转发到控制单元,然后强大的CU将向监视器发送一些信号,为相应的像素着色,让您感觉GUI。

我知道我会像回答一个简单的问题和一个报道的题外话题得到很多的回报:P

答案 1 :(得分:1)

您的问题的答案非常广泛和通用,但我认为答案涉及了解操作系统的作用。程序无法执行操作系统不允许执行的操作,并且从程序的角度来看,操作系统始终存在已定义的接口。此接口可能非常低级,如通过中断进行系统调用,或者可能处于Win32 API中的更高级别。这有很多与硬件和驱动程序有关,因为没有硬件就无法输入和输出程序,硬件是通过操作系统从最终程序中抽象出来的。例如,nVidia提供了由许多API抽象的Windows驱动程序:OpenGL,DirectX,WPF等;如果你知道通过系统调用对视频卡驱动程序的低级别访问,你可以编写自己的API。任何语言(如Java或C)都必须使用这些接口。

我希望有帮助...