在Windows下创建进程和线程的API

合集下载

createprocess 示例

createprocess 示例

标题:CreateProcess 示例1. 引言CreateProcess 是Windows操作系统中的一个API函数,它用于创建一个新的进程或者线程。

本文将通过一个示例来详细介绍CreateProcess函数的使用方法和注意事项。

2. 示例代码以下是一个使用CreateProcess函数创建新进程的示例代码:```c#include <windows.h>#include <tchar.h>int _tmain(int argc, TCHAR* argv[]){// 定义变量STARTUPINFO si;PROCESS_INFORMATION pi;// 初始化STARTUPINFO结构ZeroMemory(si, sizeof(si));si.cb = sizeof(si);ZeroMemory(pi, sizeof(pi));// 创建新进程if (!CreateProcess(NULL, // 指向可执行模块的名称_T("C:\\Windows\\system32\\calc.exe"), // 命令行参数 NULL, // 进程句柄不能被继承NULL, // 线程句柄不能被继承FALSE, // 设置句柄继承的方式0, // 创建标志NULL, // 环境变量NULL, // 指定默认工作目录si, // 指向STARTUPINFO结构pi)) // 指向PROCESS_INFORMATION结构{_tprintf(_T("CreateProcess failed (d).\n"), GetLastError()); return 1;}// 等待进程结束WaitForSingleObject(pi.hProcess, INFINITE);// 关闭进程和线程的句柄CloseHandle(pi.hProcess);CloseHandle(pi.hThread);return 0;}```3. 代码分析这段代码首先包含了头文件windows.h和tchar.h,然后定义了一个_tmain函数,该函数为程序的入口点。

createprocess和createprocessasuser

createprocess和createprocessasuser

createprocess和createprocessasuser
`CreateProcess`和`CreateProcessAsUser`都是Windows API中用于创建新进程的函数,但它们之间存在一些关键差异:
1. 用户上下文:`CreateProcessAsUser`允许你以其他用户的身份创建一个进程,而`CreateProcess`只能以当前用户的身份创建进程。

这意味着
`CreateProcessAsUser`可以用于跨用户会话创建进程。

2. 权限要求:为了使用`CreateProcessAsUser`,你需要有足够的权限来访问其他用户的会话。

相比之下,你只需要有足够的权限在当前用户会话中创建进程来使用`CreateProcess`。

因此,你应该根据具体需求选择使用哪个函数。

如果你需要在其他用户的会话中创建进程,并且有足够的权限,那么`CreateProcessAsUser`可能是更好的选择。

如果你只需要在当前用户的会话中创建进程,那么`CreateProcess`就足够了。

createprocess()的参数

createprocess()的参数

createprocess()的参数
createprocess()是一个Windows系统下的API函数,负责创建一个新进程。

该函数的参数如下:
1. lpApplicationName(应用程序名称):应用程序的可执行文件名称或者路径。

2. lpCommandLine(命令行):要传递给新进程的命令行参数。

3. lpProcessAttributes(进程安全属性):指定新进程的安全属性,可以为 NULL。

4. lpThreadAttributes(线程安全属性):指定新线程的安全属性,可以为 NULL。

5. bInheritHandles(是否继承):标识新进程是否继承父进程已经打开的句柄。

6. dwCreationFlags(创建标识):指定新进程的创建标志,例如 CREATE_NEW_CONSOLE 等。

7. lpEnvironment(环境变量):指定新进程的环境变量,可以为 NULL。

8. lpCurrentDirectory(当前目录):指定新进程的当前目录,可以为 NULL。

9. lpStartupInfo(启动信息):包含一个 STARTUPINFO 结构体,定义了新进程的一些启动信息。

10. lpProcessInformation(进程信息):包含一个PROCESS_INFORMATION 结构体,返回新进程的一些信息。

注意:以上每个参数都要按照其规定的数据类型传递值,否则可能出现运行时错误。

WindowsAPI函数大全(API之进程和线程函数)

WindowsAPI函数大全(API之进程和线程函数)

WindowsAPI函数大全(API之进程和线程函数)API之进程和线程函数CancelWaitableTimer 这个函数用于取消一个可以等待下去的计时器操作CallNamedPipe 这个函数由一个希望通过管道通信的一个客户进程调用ConnectNamedPipe 指示一台服务器等待下去,直至客户机同一个命名管道连接CreateEvent 创建一个事件对象CreateMailslot 创建一个邮路。

返回的句柄由邮路服务器使用(收件人)CreateMutex 创建一个互斥体(MUTEX)CreateNamedPipe 创建一个命名管道。

返回的句柄由管道的服务器端使用CreatePipe 创建一个匿名管道CreateProcess 创建一个新进程(比如执行一个程序)CreateSemaphore 创建一个新的信号机CreateWaitableTimer 创建一个可等待的计时器对象DisconnectNamedPipe 断开一个客户与一个命名管道的连接DuplicateHandle 在指出一个现有系统对象当前句柄的情况下,为那个对象创建一个新句柄ExitProcess 中止一个进程FindCloseChangeNotification 关闭一个改动通知对象FindExecutable 查找与一个指定文件关联在一起的程序的文件名FindFirstChangeNotification 创建一个文件通知对象。

该对象用于监视文件系统发生的变化FindNextChangeNotification 重设一个文件改变通知对象,令其继续监视下一次变化FreeLibrary 释放指定的动态链接库GetCurrentProcess 获取当前进程的一个伪句柄GetCurrentProcessId 获取当前进程一个唯一的标识符GetCurrentThread 获取当前线程的一个伪句柄GetCurrentThreadId 获取当前线程一个唯一的线程标识符GetExitCodeProces 获取一个已中断进程的退出代码GetExitCodeThread 获取一个已中止线程的退出代码GetHandleInformation 获取与一个系统对象句柄有关的信息GetMailslotInfo 获取与一个邮路有关的信息GetModuleFileName 获取一个已装载模板的完整路径名称GetModuleHandle 获取一个应用程序或动态链接库的模块句柄GetPriorityClass 获取特定进程的优先级别GetProcessShutdownParameters 调查系统关闭时一个指定的进程相对于其它进程的关闭早迟情况GetProcessTimes 获取与一个进程的经过时间有关的信息GetProcessWorkingSetSize 了解一个应用程序在运行过程中实际向它交付了多大容量的内存GetSartupInfo 获取一个进程的启动信息GetThreadPriority 获取特定线程的优先级别GetTheardTimes 获取与一个线程的经过时间有关的信息GetWindowThreadProcessId 获取与指定窗口关联在一起的一个进程和线程标识符LoadLibrary 载入指定的动态链接库,并将它映射到当前进程使用的地址空间LoadLibraryEx 装载指定的动态链接库,并为当前进程把它映射到地址空间LoadModule 载入一个Windows应用程序,并在指定的环境中运行MsgWaitForMultipleObjects 等侯单个对象或一系列对象发出信号。

WindowsAPI函数大全(完整)

WindowsAPI函数大全(完整)

WindowsAPI函数⼤全(完整)Windows API函数⼤全,从事软件开发的朋友可以参考下1. API之⽹络函数WNetAddConnection 创建同⼀个⽹络资源的永久性连接WNetAddConnection2 创建同⼀个⽹络资源的连接WNetAddConnection3 创建同⼀个⽹络资源的连接WNetCancelConnection 结束⼀个⽹络连接WNetCancelConnection2 结束⼀个⽹络连接WNetCloseEnum 结束⼀次枚举操作WNetConnectionDialog 启动⼀个标准对话框,以便建⽴同⽹络资源的连接WNetDisconnectDialog 启动⼀个标准对话框,以便断开同⽹络资源的连接WNetEnumResource 枚举⽹络资源WNetGetConnection 获取本地或已连接的⼀个资源的⽹络名称WNetGetLastError 获取⽹络错误的扩展错误信息WNetGetUniversalName 获取⽹络中⼀个⽂件的远程名称以及/或者UNC(统⼀命名规范)名称WNetGetUser 获取⼀个⽹络资源⽤以连接的名字WNetOpenEnum 启动对⽹络资源进⾏枚举的过程2. API之消息函数BroadcastSystemMessage 将⼀条系统消息⼴播给系统中所有的顶级窗⼝GetMessagePos 取得消息队列中上⼀条消息处理完毕时的⿏标指针屏幕位置GetMessageTime 取得消息队列中上⼀条消息处理完毕时的时间PostMessage 将⼀条消息投递到指定窗⼝的消息队列PostThreadMessage 将⼀条消息投递给应⽤程序RegisterWindowMessage 获取分配给⼀个字串标识符的消息编号ReplyMessage 答复⼀个消息SendMessage 调⽤⼀个窗⼝的窗⼝函数,将⼀条消息发给那个窗⼝SendMessageCallback 将⼀条消息发给窗⼝SendMessageTimeout 向窗⼝发送⼀条消息SendNotifyMessage 向窗⼝发送⼀条消息3. API之⽂件处理函数CloseHandle 关闭⼀个内核对象。

【分享】Windows API 手册

【分享】Windows API 手册

【分享】W i n d o w sA P I手册work Information Technology Company.2020YEARWindows API 手册1. API之网络函数WNetAddConnection 创建同一个网络资源的永久性连接WNetAddConnection2 创建同一个网络资源的连接WNetAddConnection3 创建同一个网络资源的连接WNetCancelConnection 结束一个网络连接WNetCancelConnection2 结束一个网络连接WNetCloseEnum 结束一次枚举操作WNetConnectionDialog 启动一个标准对话框,以便建立同网络资源的连接WNetDisconnectDialog 启动一个标准对话框,以便断开同网络资源的连接WNetEnumResource 枚举网络资源WNetGetConnection 获取本地或已连接的一个资源的网络名称WNetGetLastError 获取网络错误的扩展错误信息WNetGetUniversalName 获取网络中一个文件的远程名称以及/或者UNC(统一命名规范)名称WNetGetUser 获取一个网络资源用以连接的名字WNetOpenEnum 启动对网络资源进行枚举的过程2. API之消息函数BroadcastSystemMessage 将一条系统消息广播给系统中所有的顶级窗口GetMessagePos 取得消息队列中上一条消息处理完毕时的鼠标指针屏幕位置GetMessageTime 取得消息队列中上一条消息处理完毕时的时间PostMessage 将一条消息投递到指定窗口的消息队列字串2PostThreadMessage 将一条消息投递给应用程序RegisterWindowMessage 获取分配给一个字串标识符的消息编号ReplyMessage 答复一个消息SendMessage 调用一个窗口的窗口函数,将一条消息发给那个窗口SendMessageCallback 将一条消息发给窗口SendMessageTimeout 向窗口发送一条消息SendNotifyMessage 向窗口发送一条消息3. API之文件处理函数CloseHandle 关闭一个内核对象。

WindowsAPI函数大全(Windows编程参考手册)

WindowsAPI函数大全(Windows编程参考手册)

WindowsAPI函数大全(Windows编程参考手册)1、基础服务(Base Services):提供对Windows系统可用的基础资源的访问接口。

比如象:文件系统(file system)、外部设备(device)、,进程(process)、线程(thread)以及访问注册表(Windows registry)和错误处理机制(error handling)。

这些功能接口位于,16位Windows下的kernel.exe、krnl286.exe或krnl386.exe系统文档中;以及32位Windows下的kernel32.dll和advapi32.dll中。

2、图形设备接口(GDI):提供功能为:输出图形内容到显示器、打印机以及其他外部输出设备。

它位于16位Windows下的gdi.exe;以及32位Windows下的gdi32.dll。

3、图形化用户界面(GUI):提供的功能有创建和管理屏幕和大多数基本控件(control),比如按钮和滚动条。

接收鼠标和键盘输入,以及其他与GUI有关的功能。

这些调用接口位于:16位Windows下的user.exe,以及32位Windows下的user32.dll。

从Windows XP 版本之后,基本控件和通用对话框控件(Common Control Library)的调用接口放在comctl32.dll中。

4、通用对话框链接库(Common Dialog Box Library):为应用程序提供标准对话框,比如打开/保存文档对话框、颜色对话框和字体对话框等等。

这个链接库位于:16位Windows下的commdlg.dll 中,以及32位Windows下comdlg32.dll中。

它被归类为User Interface API之下。

5、通用控件链接库(Common Control Library):为应用程序提供接口来访问操作系统提供的一些高级控件。

比如像:状态栏(status bar)、进度条(progress bars)、工具栏(toolbar)和标签(tab)。

c语言多线程的三种实现方式

c语言多线程的三种实现方式

c语言多线程的三种实现方式1 C语言多线程实现C语言语言既可以用于创建单线程应用程序,也可以用于创建多线程应用程序。

它的多线程实现有三种方式:POSIX线程库(Pthread),Windows API,以及共享内存。

1.1 POSIX线程库(Pthread)POSIX线程库(Pthread)是Linux系统的一种线程API,它由标准POSIX提供,以实现多线程程序设计。

它提供许多函数用于创建、销毁线程,设置线程属性,等待线程完成以及通信功能等。

Pthread在多线程编程中被使用广泛,它更易于操纵,可以让多线程编程更加容易和有趣。

1.2 Windows APIWindows API 也是可用于C语言多线程编程的方式之一。

Windows API提供许多功能:创建线程,挂起线程,等待线程结束,分离线程,设置线程优先级等等。

Windows API也提供了很多函数和常量用于控制线程。

它与POSIX线程库不同,Windows API不使用POSIX线程库,而使用Windows API实现多线程程序时,同一应用程序可以具有多个线程。

1.3 共享内存共享内存是指多个进程可以访问同一个内存区域,从而使它们能够共享数据,实现常见的多线程编程任务。

在C语言中,可以使用mmap()函数将共享内存映射成文件描述符,在一定范围内允许多个进程对共享内存的随机读写访问。

这是一种实现多线程的方式,能够极大地提高程序的效率。

以上就是C语言中多线程实现的三种方式。

POSIX线程库(Pthread)可以简易实现,更能让多线程编程更加容易和有趣;Windows API也可以实现多线程编程,可以让同一应用程序有多个线程;共享内存是一种实现多线程的方法,能够极大地提高程序的效率。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

利用API在Windows下创建进程和线程
前言:
谈到在Windows创建线程的例子,在网上的很多的参考都是基于MFC的。

其实,就操作系统实验这个前提而言,大可不必去碰那个大型的MFC的框架。

在Windows命令控制台下可创建进程及线程,做些简单的进程及线程的测试程序。

1、实验准备:
要实验的Windows下的多线程实验,应做如下准备:
a) 在新建中选”Win32 Console Application”的An empty project
b) 选”工程”的”设置”选项,在”设置”中选择“C/C++”标签,在”Project Option”中,将”MLd”参数改成“MTd”(如图1)。

图1 选项
以上两步对实验成功至关重要,否则,即是代码无误,在连接时同样会出现问题。

2、Windows下进程的创建:
Windows的进程和线程模型被描述成”多进程,基于单进程的多线程”。

在创建一个线程时,Windows会做大量的工作---创建一个新的地址空间,为进程分配资源以及创建一个基线程。

CreateProcess函数的原型如下:
虽然有很多参数,不过在现阶段的实验级别,大多数参数只要用默认值即可。

下面要做的关于Windows使用进程的实验,在Linux系统下,可以使用类似:
execve(char* cmdName ,char* cmdArgu)的语句从一个程序中去执行其它的程序。

而如果在Windows下,当使用CreateProcess去执行相应的功能时,只要去改变cmdLine中的容即可,其它的参数使用默认值,具体见代码1:
代码1执行的功能是从命令行中启动这个名叫的launch的测试程序,在launch后面应加上保存有需要打开程序路径的文件名:
如在命令行中键入:
>launch set.txt
而set.txt中的容为:
C:\\WINDOWS\\SYSTEM32\\CALC.EXE
C:\\WINDOWS\\SYSTEM32\\NOTEPAD.EXE NEW.TXT
C:\\WINDOWS\\SYSTEM32\\CHARMAP.EXE
路径的前半部分为”C:\\WINDOWS\\”,这当然要视你的Windows系统的类型以及系统盘的存放位置而定。

如果是NT或2000的机器,则应使用WINNT.
/*测试程序1:
示例如使用进程的launch程序(启动程序),通过在命令行中加载相应的命令文件,去按照命令文件中指定的程序路径打开相应的程序去执行*/
通过上面这段极其简洁的代码,完成了看似有些难度的任务,让我们充分感受到采用一些高级的编程手段所带来的便捷与高效.
3、Windows线程的创建及实验:
3.1 使用CreateThread在Windows下创建线程:
在Windows中创建线程可以调用两个函数_beginthreadex和CreateThread两个函数,这里只介绍后者。

CreateThread函数(在主线程基础上创造新的线程)原型:
其中,在本实验阶段比较重要的参数是第三和第四个:
a)第三个参数是一个指向函数的指针,所以应传入的参数应为函数的地址,如&Func 的形式.而这个传入的参数,则必须被声明成为:
的形式.这个函数也就是要执行线程任务的那个函数体实体.这里应注意,传入应使用Func而非&Func。

如:CreateThread(NULL,0,Func,…)
具体原因:我目前认为是系函数前部使用WINAPI所致。

b)第四个参数应是执行线程任务的函数体实体所需要的参数,即上面所举例的函数threadFunc的参数threadArgu,这在WINDOWS中被定义成一个LPVOID的类型,目前我认为,可以把它在功能上看成和void* 类似。

参考:LPVOID的原型:
所以,当你有自己需要的类型的参数传入时,可以用
将你想要传入的参数装入一个结构体中。

在传入点,使用类似:
在函数threadFunc部的接收点,可以使用“强行转换”,如:
3.2 线程实验1---创建N个随机线程,所有线程的执行时间均为T秒,观察每个线程的运行状况:
为了使线程的运行趋于随机化,应先使用:
在每个线程的运行中,每个线程的睡眠时间为:
这样,可以使进程的运行趋于随机化.
3.3 线程实验2---Windows下可创建的线程的数目的测试:
这里使用的是让测试线程睡眠100秒,如果用的是让测试进程进入死循环的法,则会很快让系统僵掉。

在Windows XP下(赛扬800MHZ,256M存),在上述式下,测得可创建的最多的线程数目为2030个.
3.4 线程实验3---最简单的一个临界资源的读者,写者程序.
这个程序要实现的是最简单的读者,写者程序,读者将1~10十个数字依次填入临界资源区gData,当且仅当gData被读者消费后,写者才可以写入下一个数.
3.5 几点说明:
3.5.1 主调用程序在结束时使用Sleep(5000)的意图在于:使得由它所产生的子线程可以在主进程结束之前,完成如资源释放一类的工作。

3.5.2 在随机线程产生测试程序中:
之所以采用在每个线程部用
srand((unsigned int)time (NULL));
去初始化每个线程,是为了使得所有的线程拥有自己的随机数种子,否则,如果是在主调用程序中去初始化随机数种子数,则所有的线程得到的随机数序列都是一样的,将无法产生随机效果。

4、应用及推广:
采用这种在Windows下利用控制台调用Windows API进行操作系统实验的法,具有代码简洁,观察效果好与实现目标接近等优点。

相关文档
最新文档