




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、2021/8/141WindowsWindows程序的程序的内部运行原理内部运行原理2021/8/142Windows程序设计是完全不同于程序设计是完全不同于Dos环境下的程序环境下的程序设计,是一种事件驱动的程序设计方法。主要是基设计,是一种事件驱动的程序设计方法。主要是基于于消息消息的。当用户需要完成某种功能时,会调用的。当用户需要完成某种功能时,会调用OS的某种支持,的某种支持,OS将用户的需要包装成某种消息,并将用户的需要包装成某种消息,并投递到消息队列当中。然后利用应用程序从消息队投递到消息队列当中。然后利用应用程序从消息队列中取走消息并进行响应。列中取走消息并进行响应。2021/8
2、/143操作系统操作系统输入输出设备输入输出设备应用程序应用程序消息队列消息队列操作系统能操作系统能操纵输入输操纵输入输出设备,以出设备,以执行特定的执行特定的功能功能操作系统能操作系统能感知输入输感知输入输出设备的状出设备的状态变化态变化 应用程序可应用程序可以通知操作以通知操作系统执行某系统执行某个具体的动个具体的动作作 操作系统能操作系统能够将输入设够将输入设备的变化上备的变化上传给应用程传给应用程序序 2021/8/144在应用程序中要完成某个功能,都是以函数调用的形式实现的,在应用程序中要完成某个功能,都是以函数调用的形式实现的,同样,应用程序也是以函数调用的方式来通知操作系统执行相
3、同样,应用程序也是以函数调用的方式来通知操作系统执行相应的功能的。操作系统所能完成的每一个特殊功能通常都有一应的功能的。操作系统所能完成的每一个特殊功能通常都有一个函数与其对应。也就是说,操作系统把它能完成的功能以函个函数与其对应。也就是说,操作系统把它能完成的功能以函数的形式提供给应用程序使用,应用程序对这些函数的调用就数的形式提供给应用程序使用,应用程序对这些函数的调用就叫做系统调用。这些函数的集合就是叫做系统调用。这些函数的集合就是windows操作系统提供给操作系统提供给应用程序的编程接口,即应用程序的编程接口,即API。如。如CreateWindow就是一个就是一个API函数,应用程
4、序中调用这个函数,操作系统就会按照该函数提函数,应用程序中调用这个函数,操作系统就会按照该函数提供的参数信息产生一个相应的窗口。供的参数信息产生一个相应的窗口。 应用程序如何通知操作系统应用程序如何通知操作系统执行某个功能执行某个功能2021/8/145比如用户在某个程序活动时按下一个键,操作系统马上能够感比如用户在某个程序活动时按下一个键,操作系统马上能够感知到这一事件,并且能知道用户按下的是哪个键,操作系统并知到这一事件,并且能知道用户按下的是哪个键,操作系统并不决定对这个事件如何做出反应,而是将这一事件转交给应用不决定对这个事件如何做出反应,而是将这一事件转交给应用程序,由应用程序决定如
5、何对这一事件做出反应。程序,由应用程序决定如何对这一事件做出反应。好比有只蚊子叮了我们一口,我们的神经末梢(相当于操作系好比有只蚊子叮了我们一口,我们的神经末梢(相当于操作系统)马上感知到这一事件,并传递给我们的大脑(相当于应用统)马上感知到这一事件,并传递给我们的大脑(相当于应用程序)。我们的大脑最终决定如何对这一事件做出反应,如将程序)。我们的大脑最终决定如何对这一事件做出反应,如将蚊子赶走,或是将蚊子拍死。对事件做出反应的过程就是消息蚊子赶走,或是将蚊子拍死。对事件做出反应的过程就是消息响应。响应。操作系统能够将输入设备的变化操作系统能够将输入设备的变化上传给应用程序上传给应用程序202
6、1/8/146操作系统是怎样将感知到的事件传递给应用程序的呢?操作系统是怎样将感知到的事件传递给应用程序的呢?这是通过消息机制(这是通过消息机制(Message)来实现的。操作系统将每个事)来实现的。操作系统将每个事件都包装成一个称为消息的结构体件都包装成一个称为消息的结构体MSG来传递给应用程序。来传递给应用程序。typedef struct tagMSG HWND hwnd; UINT message; WPARAM wParam; LPARAM lParam; DWORD time; POINT pt; MSG; 关于消息和消息队列关于消息和消息队列窗口句柄消息的名字消息的附加参数202
7、1/8/147窗口是屏幕上的一个矩形区域,应用程序窗口是屏幕上的一个矩形区域,应用程序在该区域中显示数据并等待鼠标点击。在该区域中显示数据并等待鼠标点击。WindowsWindows应用程序的用户界面可以包含许多应用程序的用户界面可以包含许多窗口,当然要对这些窗口进行标识。窗口,当然要对这些窗口进行标识。窗窗 口口2021/8/148操作系统要管理和操作这些资源,都是通过句柄来找到对应操作系统要管理和操作这些资源,都是通过句柄来找到对应的资源。按资源的类型,又可将句柄细分成的资源。按资源的类型,又可将句柄细分成图标句柄(图标句柄(HICON)、光标句柄()、光标句柄(HCURSOR),),窗口
8、句柄(窗口句柄(HWND),应用程序实例句柄(),应用程序实例句柄(HINSTANCE)等各种类型的句柄。等各种类型的句柄。操作系统给每一个窗口指定的一个唯一的标识号即窗口句柄。操作系统给每一个窗口指定的一个唯一的标识号即窗口句柄。句柄就是资源的标识,就象指针一样,我们要索引这样一个句柄就是资源的标识,就象指针一样,我们要索引这样一个资源,就需要通过句柄去索引它。资源,就需要通过句柄去索引它。句柄:句柄: 资源的标识资源的标识2021/8/149int x,y; x=30,y=40;/x和和y既可以用来表示坐标点,也可以用来表示宽度和既可以用来表示坐标点,也可以用来表示宽度和高度,还可以用来表
9、示身高和体重。高度,还可以用来表示身高和体重。typedef int WIDTH;typedef int HEIGHT;WIDTH x;HEIGHT y;/好处:我们从变量的类型就可以知道好处:我们从变量的类型就可以知道x和和y是用来表示是用来表示宽度和高度。宽度和高度。从变量的类型区分变量的用途从变量的类型区分变量的用途2021/8/1410操作系统会为每个应用程序建立一个消息队列。这个队列是个操作系统会为每个应用程序建立一个消息队列。这个队列是个先进先出的缓冲区。消息队列中的每个元素都是一条消息。操先进先出的缓冲区。消息队列中的每个元素都是一条消息。操作系统将生成的消息放在消息队列里。第一
10、条消息放入第一格,作系统将生成的消息放在消息队列里。第一条消息放入第一格,第二条消息放入第二格,依次类推。应用程序总是取走消息队第二条消息放入第二格,依次类推。应用程序总是取走消息队列中的第一条消息。第一条消息取走后,第二条消息往前移,列中的第一条消息。第一条消息取走后,第二条消息往前移,成为第一条,剩余的消息依次前移。应用程序取得消息后,便成为第一条,剩余的消息依次前移。应用程序取得消息后,便能知道用户的操作以及应用程序的状态的变化。能知道用户的操作以及应用程序的状态的变化。当收到消息的时候,会编写针对这个消息的处理代码,这个过当收到消息的时候,会编写针对这个消息的处理代码,这个过程就叫消息
11、响应。消息响应是通过程序实现的,程就叫消息响应。消息响应是通过程序实现的,这就是这就是WindowsWindows应用程序的主要代码区。应用程序的主要代码区。消息队列消息队列2021/8/1411消息队列消息队列PostMessageSendMessage2021/8/1412在消息响应过程中,我们可能要调用操作系统提供的其他在消息响应过程中,我们可能要调用操作系统提供的其他APIAPI函函数以便完成特定的功能。例如收到窗口关闭的消息,我们就可数以便完成特定的功能。例如收到窗口关闭的消息,我们就可以调用一个销毁窗口的以调用一个销毁窗口的APIAPI函数函数DestroyWindowsDestr
12、oyWindows去关闭该窗口,去关闭该窗口,或者弹出一个消息框提示用户是否真的要关闭该窗口。或者弹出一个消息框提示用户是否真的要关闭该窗口。消息队列消息队列2021/8/1413Windows程序的入口函数程序的入口函数int APIENTRY _tWinMain ( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow);WinMain函数函数实例句柄:当运行一个程序的时候,这个运行的程序就叫实例。先前应用程序实例句柄命令行参数显示的状态2021/8/1414(1)设计一个窗口类)设计一个窗口
13、类(2)注册窗口类)注册窗口类(3)创建窗口)创建窗口(4)显示及更新窗口)显示及更新窗口窗口的创建窗口的创建2021/8/1415设计窗口类设计窗口类窗口类的类型Typedef struct tagWNDCLASSEXW UINT cbSize; UINT style; WNDPROC lpfnWndProc; int cbClsExtra; int cbWndExtra; HINSTANCE hInstance; HICON hIcon; HCURSOR hCursor; HBRUSH hbrBackground; LPCWSTR lpszMenuName; LPCWSTR lpszCla
14、ssName; HICON hIconSm; WNDCLASSEXW#ifdef UNICODEtypedef WNDCLASSEXW WNDCLASSEX;2021/8/1416在我们的程序中经常要用到一类变量,这个变量里的在我们的程序中经常要用到一类变量,这个变量里的每一位每一位(bit)都对应某一特性。当该变量的某位为都对应某一特性。当该变量的某位为1时,时,表示有该位对应的哪种特性,当该位为表示有该位对应的哪种特性,当该位为0时,即没有该时,即没有该位所对应的特性。当变量中的某几位同时为位所对应的特性。当变量中的某几位同时为1时,就表时,就表示同时具有几种特性的组合。一个变量中的哪一位
15、代示同时具有几种特性的组合。一个变量中的哪一位代表哪种意义,不容易记忆,所以根据特征的英文拼写表哪种意义,不容易记忆,所以根据特征的英文拼写的大写去定义一些宏,该宏所对应的数值中仅有与该的大写去定义一些宏,该宏所对应的数值中仅有与该特征相对应的那一位为特征相对应的那一位为1,其余的位都为,其余的位都为0。CS_VREDRAW=0X0001, CS_HREDRAW=0X0002, CS_DBLCKS=0X0008, CS_NOCLOSE=0X0200。它。它们的共同点就是只有一位为们的共同点就是只有一位为1,其余位都为,其余位都为0.窗口类的类型窗口类的类型2021/8/1417如果希望某一变量
16、的数值既有如果希望某一变量的数值既有CS_VREDRAW特性,特性,又有又有CS_HREDRAW特性,只需使用二进制特性,只需使用二进制OR操作操作符符将它们进行或运算相组合。将它们进行或运算相组合。如如style=CS_VREDRAW| CS_HREDRAW| CS_NOCLOSE。如果希望在某一变量原有的几个特征上去掉其中一个如果希望在某一变量原有的几个特征上去掉其中一个特征,用取反之后再进行与运算就能够实现。特征,用取反之后再进行与运算就能够实现。如如styl& CS_NOCLOSE。窗口类的类型窗口类的类型2021/8/1418设计窗口类设计窗口类窗口过程函数typedef s
17、truct tagWNDCLASSEXW UINT cbSize; UINT style; WNDPROC lpfnWndProc; int cbClsExtra; int cbWndExtra; HINSTANCE hInstance; HICON hIcon; HCURSOR hCursor; HBRUSH hbrBackground; LPCWSTR lpszMenuName; LPCWSTR lpszClassName; HICON hIconSm; WNDCLASSEXW2021/8/1419回调函数的原理回调函数的原理:当应用程序收到给某一窗口的消息时:当应用程序收到给某一窗口的消
18、息时(消息通常与窗口相关),就应该调用某一函数来处理这(消息通常与窗口相关),就应该调用某一函数来处理这条消息。这一调用过程不用应用程序自己来实施,而由操条消息。这一调用过程不用应用程序自己来实施,而由操作系统来完成,但是,回调函数本身的代码必须由应用程作系统来完成,但是,回调函数本身的代码必须由应用程序自己完成。对于一条消息,操作系统到底调用应用程序序自己完成。对于一条消息,操作系统到底调用应用程序中的哪个函数(回调函数)来处理呢?操作系统调用的就中的哪个函数(回调函数)来处理呢?操作系统调用的就是接受消息的窗口所属的类型中的是接受消息的窗口所属的类型中的lpfnWndProc成员指成员指定
19、的函数。每一种不同类型的窗口都有自己专用的回调函定的函数。每一种不同类型的窗口都有自己专用的回调函数,该函数是通过数,该函数是通过lpfnWndProc成员指定的。成员指定的。 窗口过程函数窗口过程函数2021/8/1420汽车厂家生产汽车好比应用程序创建窗口,用户使用汽车厂家生产汽车好比应用程序创建窗口,用户使用汽车好比操作系统管理窗口,某种汽车在销售前就指汽车好比操作系统管理窗口,某种汽车在销售前就指定好了修理站(类似回调函数),当用户的汽车出现定好了修理站(类似回调函数),当用户的汽车出现故障后(类似窗口接受到消息),汽车用户(类似操故障后(类似窗口接受到消息),汽车用户(类似操作系统)
20、自己直接找到修理站去修理,不用厂家(类作系统)自己直接找到修理站去修理,不用厂家(类似应用程序)亲自将车送到修理站去修理,但修理站似应用程序)亲自将车送到修理站去修理,但修理站还得由厂家事先建造好。还得由厂家事先建造好。窗口过程函数窗口过程函数2021/8/1421typedef struct tagWNDCLASSEXW UINT cbSize; UINT style; WNDPROC lpfnWndProc; int cbClsExtra; int cbWndExtra; HINSTANCE hInstance; HICON hIcon; HCURSOR hCursor; HBRUSH h
21、brBac kground; LPCWSTR lpszMenuName; LPCWSTR lpszClassName; HICON hIconSm; WNDCLASSEXW设计窗口类设计窗口类类的额外参数窗口的实例句柄光标的句柄画刷的句柄菜单的名字类的名字图标的句柄小图标的句柄2021/8/1422创建窗口创建窗口HWND CreateWindow( HWND CreateWindow( LPCTSTRLPCTSTR lpClassName, , /已注册的窗口类的名字LPCTSTRLPCTSTR lpWindowName, , / 窗口的名字,即标题栏上显示的文字 DWORDDWORD dw
22、Style, , / 窗口的类型 intint x, , / 窗口显示时左上角的x坐标intint y, , /窗口显示时左上角的y坐标intint nWidth, , / 窗口宽度 intint nHeight, , / 窗口高度 HWNDHWND hWndParent, , / 父窗口的句柄 HMENUHMENU hMenu, , / 菜单的句柄 HINSTANCEHINSTANCE hInstance, , / 实例的句柄 LPVOIDLPVOID lpParam / 与窗口相关的附加参数 ););2021/8/1423消息循环消息循环hAccelTable =LoadAccelerat
23、ors(hInstance,MAKEINTRESOURCE(IDC_WINMAIN2); 装载指定的加速键表。(加速键就是比如你按Ctrl+N会新建文档,Ctrl+S会保存文档,这些组合键就是加速键。使用加速键首先要建立加速键的资源,然后在程序初始化的时候LoadAccelerators,然后在WinMain主消息循环中调用TranslateAccelerator)2021/8/1424GetMessage是从消息队列中取消息,操作系统会为是从消息队列中取消息,操作系统会为每个应用程序建立一个消息队列。每个应用程序建立一个消息队列。BOOL GetMessage( LPMSG lpMsg, /
24、 消息消息 HWND hWnd, / 窗口句柄,表明从哪个窗口的消息队列中取消息。窗口句柄,表明从哪个窗口的消息队列中取消息。 UINT wMsgFilterMin, / 消息的最小值消息的最小值 UINT wMsgFilterMax / 消息的最大值消息的最大值 );消息循环消息循环通过指定消息的通过指定消息的范围来过滤消息。范围来过滤消息。如果都为如果都为0,则,则没有消息的过滤没有消息的过滤2021/8/1425消息循环消息循环TranslateAccelerator(msg.hwnd, hAccelTable, &msg);(当你定义的组合键出现时,该函数会把这个组合键消息翻译
25、成hwnd对应的窗口的WM_COMMAND消息,并直接Send到窗口过程,得到处理后该函数才返回)该函数翻译成功时返回非0值,如果失败,则返回0值即成功时就不需再调用TranslateMessage和DispatchMessage函数2021/8/1426BOOL TranslateMessage( const MSG *lpMsg );/翻译消息翻译消息就是对取到的消息对进行转换。就是对取到的消息对进行转换。当我们按下键盘上的某一个按键时,系统会产生当我们按下键盘上的某一个按键时,系统会产生WM_KEYDOWN和和WM_KEYUP两个消息,并且参数中提供这个键的虚拟扫描码。两个消息,并且参数
26、中提供这个键的虚拟扫描码。但用户按下某个键,可能需要知道具体按下的是哪个字符,在但用户按下某个键,可能需要知道具体按下的是哪个字符,在消息的附加参数中提供该键的消息的附加参数中提供该键的ASCII码。码。TranslateMessage会将会将WM_KEYDOWN和和WM_KEYUP两个消息转两个消息转换成换成WM_CHAR消息,并且将转换好的消息投递到消息队列消息,并且将转换好的消息投递到消息队列中。这个转换过程不会影响原来的消息,只会产生一个新消息。中。这个转换过程不会影响原来的消息,只会产生一个新消息。如果我们不用这个函数,则收不到如果我们不用这个函数,则收不到WM_CHAR消息。消息。
27、消息循环消息循环2021/8/1427DispatchMessage函数的作用是将收到的消息传给函数的作用是将收到的消息传给窗口的回调函数,即窗口过程函数去处理。可以这样窗口的回调函数,即窗口过程函数去处理。可以这样理解,该函数将消息路由给了操作系统,操作系统通理解,该函数将消息路由给了操作系统,操作系统通过调用窗口过程函数去处理消息。这个窗口过程函数过调用窗口过程函数去处理消息。这个窗口过程函数就是在就是在设计窗口类时设计窗口类时指定的。指定的。每当从消息队列中取到一条消息时,都会调用窗口过每当从消息队列中取到一条消息时,都会调用窗口过程函数。因此在该函数中我们要判读是哪个消息。用程函数。因
28、此在该函数中我们要判读是哪个消息。用的是的是SWITCH语句。语句。消息循环消息循环2021/8/1428设计窗口类设计窗口类窗口过程函数typedef struct tagWNDCLASSEXW UINT cbSize; UINT style; WNDPROC lpfnWndProc; int cbClsExtra; int cbWndExtra; HINSTANCE hInstance; HICON hIcon; HCURSOR hCursor; HBRUSH hbrBac kground; LPCWSTR lpszMenuName; LPCWSTR lpszClassName; HICO
29、N hIconSm; WNDCLASSEXW2021/8/1429是调用的约定。是调用的约定。vc+中有中有2种调用约定。一种是标准的调用约种调用约定。一种是标准的调用约定,一种是定,一种是C语言的调用约定。标准的调用约定就是语言的调用约定。标准的调用约定就是PASCAL的调用。主要是参数传递的顺序以及堆栈的清除有些差异。除的调用。主要是参数传递的顺序以及堆栈的清除有些差异。除了可变参数的函数外,其余的函数都是了可变参数的函数外,其余的函数都是STDCALL的调的调用习惯,但是用习惯,但是c+的编译环境,缺省下是的编译环境,缺省下是cdecl的调用约定。的调用约定。所以在所以在vc+中要调用中
30、要调用stdcall这样调用约定的这样调用约定的API函数的话,就函数的话,就要在函数原型前说明要在函数原型前说明stdcall,回调函数也应该是。,回调函数也应该是。CALLBACK2021/8/1430操作系统会在多个不同的时机发送操作系统会在多个不同的时机发送WM_PAINT消息:消息:(1)当第一次创建一个窗口时)当第一次创建一个窗口时(2)当改变窗口的大小时)当改变窗口的大小时(3)当把窗口从另一个窗口背后移出时)当把窗口从另一个窗口背后移出时(4)当最大化或最小化窗口时等等)当最大化或最小化窗口时等等这些动作都是由系统管理的,应用只是被动地接收该消这些动作都是由系统管理的,应用只是
31、被动地接收该消息,在消息响应中进行绘制操作;息,在消息响应中进行绘制操作; WM_PAINT消消 息息2021/8/1431Windows程序的生与死程序的生与死(1)程序初始化过程中调用)程序初始化过程中调用CreateWindow,为程序,为程序建立一个窗口。建立一个窗口。CreateWindow产生窗口之后会发送产生窗口之后会发送WM_CREATE消息给窗口函数。消息给窗口函数。(2)在程序运行的过程中,不断用)在程序运行的过程中,不断用GetMessage函数函数从消息队列中抓取消息。如果该消息是从消息队列中抓取消息。如果该消息是WM_QUIT,GetMessage会传回会传回0而结束
32、而结束while循环,进而结束整个循环,进而结束整个程序。程序。(3)DispatchMessag把消息派送到窗口函数。消息把消息派送到窗口函数。消息将在窗口函数中被判读并处理。将在窗口函数中被判读并处理。(4)程序不断进行()程序不断进行(2)和()和(3)的操作。)的操作。2021/8/1432Windows程序的生与死程序的生与死(5)当按下系统菜单中的)当按下系统菜单中的Close命令时,系统发送命令时,系统发送WM_CLOSE消息。一般程序的窗口函数不需要处理该消息,消息。一般程序的窗口函数不需要处理该消息,于是于是DefWindowProc处理它。处理它。(6)DefWindowP
33、roc收到收到WM_CLOSE后,调用后,调用DestroyWindow把窗口清除。把窗口清除。DestroyWindow本身又会发本身又会发送送WM_DESTROY消息。消息。(7)程序对)程序对WM_DESTROY消息的反应是调用消息的反应是调用PostQuitMessage。(8)PostQuitMessage没什么其它操作,只是送出没什么其它操作,只是送出WM_QUIT消息,准备让消息循环中的消息,准备让消息循环中的GetMessage取得,如取得,如(2)所示,结束消息循环。)所示,结束消息循环。2021/8/1433WNDCLASSEX wcex;wcex.cbSize= size
34、of(WNDCLASSEX); wcex.style= CS_HREDRAW | CS_VREDRAW;wcex.lpfnWndProc= (WNDPROC)WndProc;wcex.cbClsExtra= 0;wcex.cbWndExtra= 0;wcex.hInstance= hInstance;wcex.hIcon= LoadIcon(hInstance, (LPCTSTR)IDI_HELLO);wcex.hCursor= LoadCursor(NULL, IDC_ARROW);wcex.hbrBackground= (HBRUSH)(COLOR_WINDOW+1);wcex.lpszMenuName= (LPCSTR)IDC_HELLO;wcex.lpszClassName= szWindowClass;wcex.hIconSm= LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL);return Regis
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025终止合作合同协议书模板
- 2025授权买卖合同书模板
- 2025设备维护服务合同范本及维修服务种类
- 2025上海市园林绿化工程委托审价合同
- 2025建筑材料订购合同范本
- 2025商品房买卖合同标准模板
- 2025广告合同(期刊上刊登)
- 2025茶叶类购销合同范文
- 2025商场照明系统维护合同模板示例
- 2025婚庆服务合同全书
- 机器人自主导航与定位技术测试考核试卷
- 山东省建设施工企业安全生产许可证变更审核表
- 对公 雅思培训合同范本
- 新项目方法验证能力确认报告(固定污染源废气-烟气参数的测定HJT-397-2007)
- 持有特种证人员提成范文
- 医学影像学三基题库
- JG-T+502-2016环氧树脂涂层钢筋
- 某部副食品配送项目服务方案
- CJJ99-2017 城市桥梁养护技术标准
- 2024年《建筑节能》理论考试题库(浓缩500题)
- UL 9540 储能 中英对照
评论
0/150
提交评论