操作系统API使用方法Word文档格式.docx
- 文档编号:22849853
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:24
- 大小:28.77KB
操作系统API使用方法Word文档格式.docx
《操作系统API使用方法Word文档格式.docx》由会员分享,可在线阅读,更多相关《操作系统API使用方法Word文档格式.docx(24页珍藏版)》请在冰豆网上搜索。
三、GetPriorityClass、
DWORDWINAPIGetPriorityClass(__inHANDLEhProcess);
获取特定进程的优先级别
Long,进程的优先级,零表示失败。
四、SetPriorityClass
SetPriorityClass(hProcessLong,dwPriorityClassLong)
hProcessLong,指定一个进程句柄
dwPriorityClassLong,指定一个新优先级类的一个常数,请参考CreateProcess函数
设置一个进程的优先级别
会设置GetLastError
五、CreateSemaphore
HANDLECreateSemaphore(
LPSECURITY_ATTRIBUTESlpSemaphoreAttributes,//SD
LONGlInitialCount,//initialcount
LONGlMaximumCount,//maximumcount
LPCTSTRlpName//objectname
作用:
创建一个新的信号量
Long,如执行成功,返回信号量对象的句柄;
零表示出错。
会设置GetLastError。
即使返回一个有效的句柄,但倘若它指出同名的一个信号量已经存在,那么GetLastError也会返回ERROR_ALREADY_EXISTS
lpSemaphoreAttributesSECURITY_ATTRIBUTES,指定一个SECURITY_ATTRIBUTES结构,或传递零值(将参数声明为ByValAsLong,并传递零值)——表示采用不允许继承的默认描述符。
该参数定义了信号量的安全特性
lInitialCountLong,设置信号量的初始计数。
可设置零到lMaximumCount间的一个值
lMaximumCountLong,设置信号量的最大计数
lpNameString,指定信号量对象的名称。
用vbNullString可创建一个未命名的信号量对象。
如果已经存在拥有这个名字的一个信号量,就直接打开现成的信号量。
这个名字可能不与一个现有的互斥体、事件、可等待计时器或文件映射的名称相符
一旦不再需要,一定记住用CloseHandle关闭信号量的句柄。
它的所有句柄都关闭以后,对象自己也会删除。
一旦值大于零,信号量就会触发(发出信号)。
ReleaseSemaphore函数的作用是增加信号量的计数。
如果成功,就调用信号量上的一个等待函数来减少它的计数
六、OpenSemaphore
HANDLEOpenSemaphore(
DWORD
dwDesiredAccess,//access
BOOL
bInheritHandle,//inheritanceoption
LPCTSTR
lpName
//objectname
为现有的一个已命名信号机对象创建一个新句柄。
Long,如执行成功,返回对象句柄;
零表示失败。
dwDesiredAccessLong,下述常数之一:
SEMAPHORE_ALL_ACCESS要求对事件对象的完全访问;
SEMAPHORE_MODIFY_STATE允许使用ReleaseSemaphore函数;
SYNCHRONIZE允许同步使用信号机对象。
bInheritHandleLong,如果允许子进程继承句柄,则设为TRUE。
lpNameString,指定要打开的对象的名字。
一旦不再需要,注意一定要用CloseHandle关闭信号机句柄。
如对象的所有句柄都已关闭,那么对象也会删除。
七、WaitForSingleObject
DWORDWINAPIWaitForSingleObject(
__inHANDLEhHandle,
__inDWORDdwMilliseconds);
参数:
hHandle[in]对象句柄。
可以指定一系列的对象,如Event、Job、Memoryresourcenotification、Mutex、Process、Semaphore、Thread、Waitabletimer等。
当等待仍在挂起状态时,句柄被关闭,那么函数行为是未定义的。
该句柄必须具有SYNCHRONIZE访问权限。
dwMilliseconds[in]定时时间间隔,单位为milliseconds(毫秒).如果指定一个非零值,函数处于等待状态直到hHandle标记的对象被触发,或者时间到了。
如果dwMilliseconds为0,对象没有被触发信号,函数不会进入一个等待状态,它总是立即返回。
如果dwMilliseconds为INFINITE,对象被触发信号后,函数才会返回。
WAIT_ABANDONED0x00000080:
当hHandle为mutex时,如果拥有mutex的线程在结束时没有释放核心对象会引发此返回值。
WAIT_OBJECT_00x00000000:
核心对象已被激活
WAIT_TIMEOUT0x00000102:
等待超时
WAIT_FAILED0xFFFFFFFF:
出现错误,可通过GetLastError得到错误代码
八.ReleaseSemaphore
ReleaseSemaphore函数用于对指定的信号量增加指定的值;
原型:
BOOLReleaseSemaphore(
HANDLEhSemaphore,
LONGlReleaseCount,
LPLONGlpPreviousCount
hSemaphore[输入参数]
所要操作的信号量对象的句柄,这个句柄是CreateSemaphore或者OpenSemaphore函数的返回值。
这个句柄必须有SEMAPHORE_MODIFY_STATE的权限。
lReleaseCount[输入参数]
这个信号量对象在当前基础上所要增加的值,这个值必须大于0,如果信号量加上这个值会导致信号量的当前值大于信号量创建时指定的最大值,那么这个信号量的当前值不变,同时这个函数返回FALSE;
lpPreviousCount[输出参数]
指向返回信号量上次值的变量的指针,如果不需要信号量上次的值,那么这个参数可以设置为NULL;
如果成功返回TRUE,如果失败返回FALSE,可以调用GetLastError函数得到详细出错信息;
九.CloseHandle
BOOLCloseHandle(
HANDLEhObject//hObjectLong,欲关闭的一个对象的句柄
[1]
参数:
hObject:
代表一个已打开对象handle。
返回值
TRUE:
执行成功;
FALSE:
执行失败,可以调用GetLastError()获知失败原因。
函数说明:
关闭一个内核对象。
其中包括文件、文件映射、进程、线程、安全和同步对象等。
在CreateThread成功之后会返回一个hThread的handle,且内核对象的计数加1,CloseHandle之后,引用计数减1,当变为0时,系统删除内核对象。
若在线程执行完之后,没有调用CloseHandle,在进程执行期间,将会造成内核对象的泄露,相当于句柄泄露,但不同于内存泄露,这势必会对系统的效率带来一定程度上的负面影响。
但当进程结束退出后,系统会自动清理这些资源
十.CreateFileMapping
创建一个新的文件映射内核对象。
返回值:
Long,新建文件映射对象的句柄;
零意味着出错。
即使函数成功,但倘若返回的句柄属于一个现成的文件映射对象,那么GetLastError也会设置成ERROR_ALREADY_EXISTS。
在这种情况下,文件映射的长度就是现有对象的长度,而不是这个函数指定的尺寸。
HANDLECreateFileMapping(
HANDLEhFile,//物理文件句柄
LPSECURITY_ATTRIBUTESlpAttributes,//安全设置
DWORDflProtect,//保护设置
DWORDdwMaximumSizeHigh,//高位文件大小
DWORDdwMaximumSizeLow,//低位文件大小
LPCTSTRlpName//共享内存名称
1)物理文件句柄
任何可以获得的物理文件句柄,如果你需要创建一个物理文件无关的内存映射也无妨,将它设置成为0xFFFFFFFF(INVALID_HANDLE_VALUE)就可以了。
如果需要和物理文件关联,要确保你的物理文件创建的时候的访问模式和"
保护设置"
匹配,比如:
物理文件只读,内存映射需要读写就会发生错误。
推荐你的物理文件使用独占方式创建。
如果使用INVALID_HANDLE_VALUE,也需要设置需要申请的内存空间的大小,无论物理文件句柄参数是否有效,这样CreateFileMapping就可以创建一个和物理文件大小无关的内存空间给你,甚至超过实际文件大小,如果你的物理文件有效,而大小参数为0,则返回给你的是一个和物理文件大小一样的内存空间地址范围。
返回给你的文件映射地址空间是可以通过复制,集成或者命名得到,初始内容为0。
2)保护设置
就是安全设置,不过一般设置NULL就可以了,使用默认的安全配置。
在win2k下如果需要进行限制,这是针对那些将内存文件映射共享给整个网络上面的应用进程使用时,可以考虑进行限制。
3)高位文件大小
亲们,我想目前我们的机器都是32位的东东,不可能得到超过32位进程所能寻址的私有32位地址空间,一般还是设置0吧,我没有也不想尝试将它设置超过0的情况。
4)低位文件大小
这个还是可以进行设置的,不过为了让其他共享用户知道你申请的文件映射的相关信息,我使用的时候是在获得的地址空间头部添加一个结构化描述信息,记录内存映射的大小,名称等,这样实际申请的空间就比输入的增加了一个头信息结构大小了,我认为这样类似BSTR的方式应该是比较合理的。
5)共享内存名称
如果为了对内存进行互斥访问,设置了一个互斥句柄,而名称选择和命名共享内存同名,他们使用共同的namespace,会导致错误。
6)调用CreateFileMapping的时候GetLastError的对应错误
ERROR_FILE_INVALID如果企图创建一个零长度的文件映射,应有此报
ERROR_INVALID_HANDLE如果发现你的命名内存空间和现有的内存映射,互斥量,信号量,临界区同名就麻烦了
ERROR_ALREADY_EXISTS表示内存空间命名已经存在
7)相关服务或者平台的命名保留TerminalServices:
命名可以包含"
Global"
或者"
Local"
前缀在全局或者会话名空间初级文件映射。
其他部分可以包含任何除了()以外的字符,可以参考KernelObjectNameSpaces。
十一.OpenFileMapping
打开一个现成的文件映射对象。
Long,指定文件映射对象的句柄。
零表示出错,可以设置GetLastError。
OpenFileMappingA"
(
ByValdwDesiredAccessAsLong,
ByValbInheritHandleAsLong,
ByVallpNameAsString
)AsLong
dwDesiredAccessLong,带有前缀FILE_MAP_?
?
的一个常数。
参考MapViewOfFile函数dwDesiredAccess参数的说明。
bInheritHandleLong,如这个函数返回的句柄能由当前进程启动的新进程继承,则这个参数为TRUE。
lpNameString,指定要打开的文件映射对象名称。
十二.MapViewOfFile
LPVOIDWINAPIMapViewOfFile(
__inHANDLEhFileMappingObject,
__inDWORDdwDesiredAccess,
__inDWORDdwFileOffsetHigh,
__inDWORDdwFileOffsetLow,
__inSIZE_TdwNumberOfBytesToMap
参数详解:
参数1:
hFileMappingObject为CreateFileMapping()返回的文件映像对象句柄。
参数2:
dwDesiredAccess映射对象的文件数据的访问方式,而且同样要与CreateFileMapping()函数所设置的保护属性相匹配。
可取以下值:
FILE_MAP_ALL_ACCESS等价于CreateFileMapping的FILE_MAP_WRITE|FILE_MAP_READ.文件映射对象被创建时必须指定PAGE_READWRITE选项.
FILE_MAP_COPYA可以读取和写入文件.写入操作会导致系统为该页面创建一份副本.在调用CreateFileMapping时必须传入PAGE_WRITECOPY保护属性.
FILE_MAP_EXECUTE可以将文件中的数据作为代码来执行.在调用CreateFileMapping时可以传入PAGE_EXECUTE_READWRITE或PAGE_EXECUTE_READ保护属性.
FILE_MAP_READ可以读取文件.在调用CreateFileMapping时可以传入PAGE_READONLY或PAGE_READWRITE保护属性.
FILE_MAP_WRITEA可以读取和写入文件.在调用CreateFileMapping时必须传入PAGE_READWRITE保护属性.
参数3:
dwFileOffsetHigh表示文件映射起始偏移的高32位.
参数4:
dwFileOffsetLow表示文件映射起始偏移的低32位.文件偏移量必须是系统分配粒度的整数倍.
参数5:
dwNumberOfBytes指定映射文件的字节数.
如果成功,则返回映射视图文件的开始地址值,如果失败,则返回NULL.
十三.UnmapViewOfFile
UnmapViewOfFile(ByVallpBaseAddressAsLong)
说明
在当前应用程序的内存地址空间解除对一个文件映射对象的映射。
Long,非零表示成功,零表示失败。
参数类型及说明:
lpBaseAddressLong,指定要解除映射的一个文件映射的基准地址。
这个地址是早先用MapViewOfFile函数获得的
十四.CreateProcess
BOOLCreateProcess
(
LPCTSTRlpApplicationName,
LPTSTRlpCommandLine,
LPSECURITY_ATTRIBUTESlpProcessAttributes。
LPSECURITY_ATTRIBUTESlpThreadAttributes,
BOOLbInheritHandles,
DWORDdwCreationFlags,
LPVOIDlpEnvironment,
LPCTSTRlpCurrentDirectory,
LPSTARTUPINFOlpStartupInfo,
LPPROCESS_INFORMATIONlpProcessInformation
lpApplicationName
指向一个NULL结尾的、用来指定可执行模块的字符串。
这个字符串可以是可执行模块的绝对路径,也可以是相对路径,在后一种情况下,函数使用当前驱动器和目录建立可执行模块的路径。
这个参数可以被设为NULL,在这种情况下,可执行模块的名字必须处于lpCommandLine参数最前面并由空格符与后面的字符分开。
lpCommandLine
指向一个以NULL结尾的字符串,该字符串指定要执行的命令行。
这个参数可以为空,那么函数将使用lpApplicationName参数指定的字符串当做要运行的程序的命令行。
如果lpApplicationName和lpCommandLine参数都不为空,那么lpApplicationName参数指定将要被运行的模块,lpCommandLine参数指定将被运行的模块的命令行。
新运行的进程可以使用GetCommandLine函数获得整个命令行。
C语言程序可以使用argc和argv参数。
lpProcessAttributes
指向一个SECURITY_ATTRIBUTES结构体,这个结构体决定是否返回的句柄可以被子进程继承。
如果lpProcessAttributes参数为空(NULL),那么句柄不能被继承。
在WindowsNT中:
SECURITY_ATTRIBUTES结构的lpSecurityDescriptor成员指定了新进程的安全描述符,如果参数为空,新进程使用默认的安全描述符。
lpThreadAttributes
同lpProcessAttribute,不过这个参数决定的是线程是否被继承.通常置为NULL.
bInheritHandles
指示新进程是否从调用进程处继承了句柄。
如果参数的值为真,调用进程中的每一个可继承的打开句柄都将被子进程继承。
被继承的句柄与原进程拥有完全相同的值和访问权限。
dwCreationFlags
指定附加的、用来控制优先类和进程的创建的标志。
以下的创建标志可以以除下面列出的方式外的任何方式组合后指定。
⑴值:
CREATE_DEFAULT_ERROR_MODE
含义:
新的进程不继承调用进程的错误模式。
CreateProcess函数赋予新进程当前的默认错误模式作为替代。
应用程序可以调用SetErrorMode函数设置当前的默认错误模式。
这个标志对于那些运行在没有硬件错误环境下的多线程外壳程序是十分有用的。
对于CreateProcess函数,默认的行为是为新进程继承调用者的错误模式。
设置这个标志以改变默认的处理方式。
⑵值:
CREATE_NEW_CONSOLE
新的进程将使用一个新的控制台,而不是继承父进程的控制台。
这个标志不能与DETACHED_PROCESS标志一起使用。
⑶值:
CREATE_NEW_PROCESS_GROUP
新进程将使一个进程树的根进程。
进程树中的全部进程都是根进程的子进程。
新进程树的用户标识符与这个进程的标识符是相同的,由lpProcessInformation参数返回。
进程树经常使用GenerateConsoleCtrlEvent函数允许发送CTRL+C或CTRL+BREAK信号到一组控制台进程。
⑷值:
CREATE_SEPARATE_WOW_VDM
如果被设置,新进程将会在一个私有的虚拟DOS机(VDM)中运行。
另外,默认情况下所有的16位Windows应用程序都会在同一个共享的VDM中以线程的方式运行。
单独运行一个16位程序的优点是一个应用程序的崩溃只会结束这一个VDM的运行;
其他那些在不同VDM中运行的程序会继续正常的运行。
同样的,在不同VDM中运行的16位Windows应用程序拥有不同的输入队列,这意味着如果一个程序暂时失去响应,在独立的VDM中的应用程序能够继续获得输入。
⑸值:
CREATE_SHARED_WOW_VDM
如果WIN.INI中的Windows段的DefaultSeparateVDM选项被设置为真,这个标识使得CreateProcess函数越过这个选项并在共享的虚拟DOS机中运行新进程。
⑹值:
CREATE_SUSPENDED
新进程的主线程会以暂停的状态被创建,直到调用ResumeThread函数被调用时才运行。
⑺值:
CREATE_UNICODE_ENVIRONMENT
如果被设置,由lpEnvironment参数指定的环境块使用Unicode字符,如果为空,环境块使用ANSI字符。
⑻值:
DEBUG_PROCESS
如果这个标志被设置,调用进程将被当做一个调试程序,并且新进程会被当做被调试的进程。
系统把被调试程序发生的所有调试事件通知给调试器。
如果你使用这个标志创建进程,只有调用进程(调用CreateProcess函数的进程)可以调用WaitForDebugEvent函数。
⑼值:
DEBUG_ONLY_THIS_PROCESS
如果此标志没有被设置且调用进程正在被调试,新进程将成为调试调用进程的调试器的另一个调试对象。
如果调用进程没有被调试,有关调试的行为就不会产生。
⑽值:
DETACHED_PROCESS
对于控制台进程,新进程没有访问父进程控制台的权限。
新进程可以通过AllocConsole函数自己创建一个新的控制台。
这个标志不可以与CREATE_NEW_CONSOLE标志一起使用。
dwCreationFlags参数
还用来控制新进程的优先类,优先类用来决定此进程的线程调度的优先级。
如果下面的优先级类标志都没有被指定,那么默认的优先类是NORMAL_PRIORITY_CLASS,除非被创建的进程是IDLE_PRIORITY_CLASS。
在这种情况下子进程的默认优先类是IDLE_PRIORITY_CLASS。
可以选择下面的标志中的一个:
优先级:
HIGH_P
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 API 使用方法