windows 执行任何操作都是通过调用API来实现的么
3个回答
展开全部
我觉得不一定全是。windows的应用程序的执行应该都是由API来完成的,包括普通的应用程序和系统的应用程序。但是驱动程序好像不是由API来完成的。使用DDK,开发驱动程序,是windows系统要依赖它,它比系统还底层。
不过你问的是任何操作了,如果单是从应用程序的角度来看的话,全部都是通过API来完成的了。看一个基本的win32的应用程序吧!
.386
.model flat,stdcall
option casemap:none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;include文件定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include windows.inc
include kernel32.inc
includelib kernel32.lib
include user32.inc
includelib user32.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;数据段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.data
szClassName db 'MyClass',0
szCaption db 'My First Window',0
.data?
hInstance dd ?
hWinMain dd ?
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.code
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;窗口过程 ;窗口过程属于回调,回调由windows调用
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_ProcWinMain proc hWnd,uMsg,wParam,lParam
local @stPs:PAINTSTRUCT
local @stRect:RECT
local @hDc
pushad
mov eax,uMsg
;下面的分支就是你所有的操作都要在这里处理,相应的消息使用相应的API函数。
.if eax==WM_CLOSE
invoke DestroyWindow,hWinMain
invoke PostQuitMessage,NULL
;****************************************************************************
.else
//如果相应某消息你不处理,可以使用DefWindowProc让windows自行处理
invoke DefWindowProc,hWnd,uMsg,wParam,lParam
ret
.endif
;****************************************************************************
xor eax,eax
popad
ret
_ProcWinMain endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_WinMain proc
local @stWndClass:WNDCLASSEX
local @stMsg:MSG
invoke GetModuleHandle,NULL
mov hInstance,eax
invoke RtlZeroMemory,addr @stWndClass,sizeof @stWndClass
;*****************************************************************************
;注册窗口类
;*****************************************************************************
invoke LoadCursor,0,IDC_ARROW
mov @stWndClass.hCursor,eax
push hInstance
pop @stWndClass.hInstance
mov @stWndClass.cbSize,sizeof WNDCLASSEX
mov @stWndClass.style,CS_HREDRAW or CS_VREDRAW
mov @stWndClass.lpfnWndProc,offset _ProcWinMain
mov @stWndClass.hbrBackground,COLOR_WINDOW+1
mov @stWndClass.lpszClassName,offset szClassName
invoke RegisterClassEx,addr @stWndClass
;*****************************************************************************
;建立并显示窗口
;*****************************************************************************
invoke CreateWindowEx,WS_EX_CLIENTEDGE,offset szClassName,\
offset szCaption,WS_OVERLAPPEDWINDOW,\
100,100,600,400,\
NULL,NULL,hInstance,NULL
mov hWinMain,eax
invoke ShowWindow,hWinMain,SW_SHOWNORMAL
invoke UpdateWindow,hWinMain
;*****************************************************************************
;消息循环
;*****************************************************************************
.while TRUE
invoke GetMessage,addr @stMsg,NULL,0,0
.break .if eax==0
invoke TranslateMessage,addr @stMsg
invoke DispatchMessage,addr @stMsg
.endw
ret
_WinMain endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
start:
invoke _WinMain
invoke ExitProcess,NULL
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
end start
上面的程序是我学win32汇编时的内容。理解了这个就会明白一些基本的知识了。
不过你问的是任何操作了,如果单是从应用程序的角度来看的话,全部都是通过API来完成的了。看一个基本的win32的应用程序吧!
.386
.model flat,stdcall
option casemap:none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;include文件定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include windows.inc
include kernel32.inc
includelib kernel32.lib
include user32.inc
includelib user32.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;数据段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.data
szClassName db 'MyClass',0
szCaption db 'My First Window',0
.data?
hInstance dd ?
hWinMain dd ?
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.code
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;窗口过程 ;窗口过程属于回调,回调由windows调用
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_ProcWinMain proc hWnd,uMsg,wParam,lParam
local @stPs:PAINTSTRUCT
local @stRect:RECT
local @hDc
pushad
mov eax,uMsg
;下面的分支就是你所有的操作都要在这里处理,相应的消息使用相应的API函数。
.if eax==WM_CLOSE
invoke DestroyWindow,hWinMain
invoke PostQuitMessage,NULL
;****************************************************************************
.else
//如果相应某消息你不处理,可以使用DefWindowProc让windows自行处理
invoke DefWindowProc,hWnd,uMsg,wParam,lParam
ret
.endif
;****************************************************************************
xor eax,eax
popad
ret
_ProcWinMain endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_WinMain proc
local @stWndClass:WNDCLASSEX
local @stMsg:MSG
invoke GetModuleHandle,NULL
mov hInstance,eax
invoke RtlZeroMemory,addr @stWndClass,sizeof @stWndClass
;*****************************************************************************
;注册窗口类
;*****************************************************************************
invoke LoadCursor,0,IDC_ARROW
mov @stWndClass.hCursor,eax
push hInstance
pop @stWndClass.hInstance
mov @stWndClass.cbSize,sizeof WNDCLASSEX
mov @stWndClass.style,CS_HREDRAW or CS_VREDRAW
mov @stWndClass.lpfnWndProc,offset _ProcWinMain
mov @stWndClass.hbrBackground,COLOR_WINDOW+1
mov @stWndClass.lpszClassName,offset szClassName
invoke RegisterClassEx,addr @stWndClass
;*****************************************************************************
;建立并显示窗口
;*****************************************************************************
invoke CreateWindowEx,WS_EX_CLIENTEDGE,offset szClassName,\
offset szCaption,WS_OVERLAPPEDWINDOW,\
100,100,600,400,\
NULL,NULL,hInstance,NULL
mov hWinMain,eax
invoke ShowWindow,hWinMain,SW_SHOWNORMAL
invoke UpdateWindow,hWinMain
;*****************************************************************************
;消息循环
;*****************************************************************************
.while TRUE
invoke GetMessage,addr @stMsg,NULL,0,0
.break .if eax==0
invoke TranslateMessage,addr @stMsg
invoke DispatchMessage,addr @stMsg
.endw
ret
_WinMain endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
start:
invoke _WinMain
invoke ExitProcess,NULL
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
end start
上面的程序是我学win32汇编时的内容。理解了这个就会明白一些基本的知识了。
展开全部
一般来说是的
一般widows可以看成层次结构的
应用
----
api
---------
驱动
---------------
硬件
也就是说你的程序一般是调用api来和硬件打交道,比如说你要打印东西 你就要调用打印相关的api函数,然后api去调用驱动程序,驱动程序去操作硬件。
但是,api是且仅是windows通过库的型式提供的一套函数而已,你自己也可以定义一套api出来。
而且自己开发一些设备的驱动程序当然也是可以的。(否则硬件厂商就该去找微软拼命了)
更有甚者你可以连驱动都抛掉直接去读写硬件地址(当然在某些版本的windows中低级地址是被保护的,要通过iopm替换等手段才能得到权限)。
一般widows可以看成层次结构的
应用
----
api
---------
驱动
---------------
硬件
也就是说你的程序一般是调用api来和硬件打交道,比如说你要打印东西 你就要调用打印相关的api函数,然后api去调用驱动程序,驱动程序去操作硬件。
但是,api是且仅是windows通过库的型式提供的一套函数而已,你自己也可以定义一套api出来。
而且自己开发一些设备的驱动程序当然也是可以的。(否则硬件厂商就该去找微软拼命了)
更有甚者你可以连驱动都抛掉直接去读写硬件地址(当然在某些版本的windows中低级地址是被保护的,要通过iopm替换等手段才能得到权限)。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
不一定
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询