社区
Windows SDK/API
帖子详情
如何判断用CreateProcess启动的进程已经启动完成?
MarsChen
2002-10-21 10:43:36
我用CreateProcess执行一个Exe文件,接着就要用EnumWindows来查找该进程的主窗口Hwnd,
可是我发现如果一执行完CreateProcess就执行EnumWindows则肯定查不到该进程的主窗口Hwnd;如果中间加一延时(2s)就可以
CreateProcess不会是异步执行的吧?我怎么才能知道被启动的进程已经创建好了主窗体呢?用这种延时的办法总不太好
请高手指教,多谢!
...全文
1296
19
打赏
收藏
如何判断用CreateProcess启动的进程已经启动完成?
我用CreateProcess执行一个Exe文件,接着就要用EnumWindows来查找该进程的主窗口Hwnd, 可是我发现如果一执行完CreateProcess就执行EnumWindows则肯定查不到该进程的主窗口Hwnd;如果中间加一延时(2s)就可以 CreateProcess不会是异步执行的吧?我怎么才能知道被启动的进程已经创建好了主窗体呢?用这种延时的办法总不太好 请高手指教,多谢!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
19 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
iec
2002-11-28
打赏
举报
回复
ok
zbc
2002-11-15
打赏
举报
回复
不错,学习学习………
MarsChen
2002-11-15
打赏
举报
回复
多谢juqiang(方枪枪(正在修炼伤心小箭))、jishiping(JSP 季世平)
清空notepade问题已知,至于waitforsingleobject的问题,我再说明白点:
通过CreateProcess启动notepad,并且获知其processid,然后等待其创建主窗体,如果创建完了,获取其主窗体的handle
我现在没有98,不能验证waitforsingleobject在98和2k的不同,至于不断去查找,我认为也不是一个好办法,用钩子可能也没这个必要,有人愿意写代码试试吗?
chaichaichai
2002-11-15
打赏
举报
回复
还是用钩子函数把
myy
2002-11-14
打赏
举报
回复
建一共享内存为注册区,不过要求被调的exe也有源码。
keenleung
2002-11-14
打赏
举报
回复
创建一个线程不断地FindWindow不就可以了?
LanceX
2002-11-14
打赏
举报
回复
好象是没有办法在做到你要的效果,我也做过相同的事。可以用以下的代码在
进程创建后关闭它,不过这种做法并不被推荐,因为这样内核对象可能有资源未被释放,会导致无法预料的错误。
CreateProcess(NULL,"notepad.exe",NULL, NULL,
TRUE, NORMAL_PRIORITY_CLASS, NULL, NULL,
&StartupInfo, &ProcessInfo);
if (GetExitCodeProcess(ProcInfo.hProcess,&exitcode)){
TerminateProcess(ProcInfo.hProcess,exitcode);
CloseHandle(ProcInfo.hProcess);
}
如有新体会,多多交流。
jishiping
2002-11-14
打赏
举报
回复
CreateProcess只负责启动程序,不会等待被启动程序的主窗口出现。如果想
等待主窗口出现,只能是不断查找,直到那个程序的主窗口创建。当然了,每
次查找之间需要用Sleep等待一会儿(否则这段时间CPU的使用率很高)。另外
可以使用钩子,不过为了这点小事用钩子太不划算了。
“如何使notepad清空内容?”
先发送消息EM_SETSEL(wParam=0,lParam=-1),这样就选择全部的文字,
然后发送消息WM_CLEAR就可以了。
juqiang
2002-11-14
打赏
举报
回复
waitforsingleobject确实有那个问题,但是在98上和w2k上效果是不同的,你可以按照release方式编译后,分别copy过去试验一下就知道了。
MarsChen
2002-11-14
打赏
举报
回复
这些办法都不可行,应该有更好的办法,有人谈谈看法吗?
MarsChen
2002-10-30
打赏
举报
回复
to Adayuer([±0℃]) :
"
WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
加这句的目的就是等创建的进程结束后才执行后面的语句.
"
你是怎么试的?我试过后发现它是在等待创建的进程结束(程序关闭)后才返回的,但我希望的是在被创建的进程创建完主窗体后就返回,有什么方法么?
大大怪老张
2002-10-24
打赏
举报
回复
WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
加这句的目的就是等创建的进程结束后才执行后面的语句.
你可以用ShellExecute() 试试,它的返回值可以让你知道你指定的程序是否运行了...
至于找到主窗体,可以用FindWindow()...
个人认为在 执行完 CreatProcess()之后就用EnumWindow 应该是检查不到的.显然windows初始化一个pe文件的运行环境并加载它需要的时间应该比windows执行一条语句的时间要长.
MarsChen
2002-10-23
打赏
举报
回复
有没有人谈谈了?
MarsChen
2002-10-22
打赏
举报
回复
多谢!
不过,你试过么?好像这样必须等到被启动的notepad进程关闭,才能执行后面的语句
COKING
2002-10-22
打赏
举报
回复
CreateProcess(NULL,"notepad.exe",NULL, NULL,
TRUE, NORMAL_PRIORITY_CLASS, NULL, NULL,
&StartupInfo, &ProcessInfo);
WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
MarsChen
2002-10-22
打赏
举报
回复
没有人愿意谈谈看法么?
bufanxiong
2002-10-21
打赏
举报
回复
给你个代码参考一下:
头文件中定义:HANDLE hNotePad,hWordWeb;
if(CreateProcess(NULL, strNotepad.c_str(), NULL, NULL,
TRUE, NORMAL_PRIORITY_CLASS, NULL, NULL,
&StartupInfo, &ProcessInfo))
{
hNotePad=ProcessInfo.hProcess;//这样就得到了主应用程序窗体的句柄
}
不是很清楚你问的什么?自己看看代码,应该立刻就得到了主窗体的句柄
MarsChen
2002-10-21
打赏
举报
回复
加问一问题:
如何使notepad清空内容?
现启动一个notepad,得到其hwnd,并且也已经可以向其发信了,但应该发什么样的信才能使该notepad清空其中的内容呢?
MarsChen
2002-10-21
打赏
举报
回复
多谢,不过我问的不是这个
虽然该函数返回值后能从processinfo中得到被创建进程的id,handle,但实际上该进程的主窗体并未创建成功
有没有人碰到过同样的问题?能指点一下么?
管理员权限
启动
程序
实现代码
启动
程序时使用管理员权限
启动
,解决程序不是管理员权限的问题!
Win32开发系列文章17-
启动
和关闭
进程
示例源码
Win32开发系列博文第17篇中,有关使用
CreateProcess
函数创建
进程
,用TerminateProcess函数干掉
进程
的例子,外加ShellExecute函调用。
操作系统课程设计—
进程
控制
1. 创建
进程
CreateProcess
() 调用的核心参数是可执行文件运行时的文件名及其命令行。下表详细地列出了每个参数的类型和名称。
CreateProcess
() 函数的参数 2. 正在运行的
进程
如果一个
进程
拥有至少一个执行线程,则为正在系统中运行的
进程
。当调用ExitProcess() API函数,通知系统终止它所拥有的所有正在运行、准备运行或正在挂起的其他线程。当
进程
正在运行时,可以查看它的许多特性。 首先可利用GetCurrentProcessId() 函数来查看的
进程
特性是
进程
标识符 (PID),返回的PID在整个系统中都可使用。其他的可显示当前
进程
信息的API函数如GetStartupInfo()和GetProcessShutdownParameters() 可给出
进程
的配置信息。 通常,一个
进程
需要它的运行期环境的信息。例如API函数GetModuleFileName() 和GetCommandLine() ,可以给出用在
CreateProcess
() 中的参数以
启动
应用程序。 用GetGuiResources() 来查看
进程
的GUI资源。此函数既可返回指定
进程
中的打开的GUI对象的数目,也可返回指定
进程
中打开的USER对象的数目。
进程
的其他性能信息可通过GetProcessIoCounters()、GetProcessPriorityBoost() 、GetProcessTimes()、GetProcessWorkingSetSize() 和GetProcessVersion()得到。 3. 终止
进程
所有
进程
都是以调用ExitProcess() 或者TerminateProcess() 函数结束的。最好用前者而不要用后者,因为
进程
是在
完成
了它的所有的关闭任务之后以正常的终止方式来调用前者的。而外部
进程
通常调用后者即突然终止
进程
的进行,由于关闭时的途径不太正常,有可能引起错误的行为。
操作系统实验实验
进程
管理
实验二
进程
管理 Windows所创建的每个
进程
都从调用
CreateProcess
() API函数开始,该函数的任务是在对象管理器子系统内初始化
进程
对象。每一
进程
都以调用ExitProcess() 或TerminateProcess() API函数终止。通常应用程序的框架负责调用 ExitProcess() 函数。对于C++ 运行库来说,这一调用发生在应用程序的main() 函数返回之后。 1. 创建
进程
CreateProcess
() 调用的核心参数是可执行文件运行时的文件名及其命令行。表 2-1详细地列出了每个参数的类型和名称。 表2-1
CreateProcess
() 函数的参数 参数名称 使用目的 LPCTSTR lpApplivationName 全部或部分地指明包括可执行代码的EXE文件的文件名 LPCTSTR lpCommandLine 向可执行文件发送的参数 LPSECURIITY_ATTRIBUTES lpProcessAttributes 返回
进程
句柄的安全属性。主要指明这一句柄是否应该由其他子
进程
所继承 LPSECURIITY_ATTRIBUTES lpThreadAttributes 返回
进程
的主线程的句柄的安全属性 BOOL bInheritHandle 一种标志,告诉系统允许新
进程
继承创建者
进程
的句柄 DWORD dwCreationFlage 特殊的创建标志 (如CREATE_SUSPENDED) 的位标记 LPVOID lpEnvironment 向新
进程
发送的一套环境变量;如为null值则发送调用者环境 LPCTSTR lpCurrentDirectory 新
进程
的
启动
目录 STARTUPINFO lpStartupInfo STARTUPINFO结构,包括新
进程
的输入和输出配置的详情 LPPROCESS_INFORMATION lpProcessInformation 调用的结果块;发送新应用程序的
进程
和主线程的句柄和ID 可以指定第一个参数,即应用程序的名称,其中包括相对于当前
进程
的当前目录的全路径或者利用搜索方法找到的路径;lpCommandLine参数允许调用者向新应用程序发送数据;接下来的三个参数与
进程
和它的主线程以及返回的指向该对象的句柄的安全性有关。 然后是标志参数,用以在dwCreationFlags参数中指明系统应该给予新
进程
什么行为。经常使用的标志是CREATE_SUSPNDED,告诉主线程立刻暂停。当准备好时,应该使用ResumeThread() API来
启动
进程
。另一个常用的标志是CREATE_NEW_CONSOLE,告诉新
进程
启动
自己的控制台窗口,而不是利用父窗口。这一参数还允许设置
进程
的优先级,用以向系统指明,相对于系统中所有其他的活动
进程
来说,给此
进程
多少CPU时间。 接着是
CreateProcess
() 函数调用所需要的三个通常使用缺省值的参数。第一个参数是lpEnvironment参数,指明为新
进程
提供的环境;第二个参数是lpCurrentDirectory,可用于向主创
进程
发送与缺省目录不同的新
进程
使用的特殊的当前目录;第三个参数是STARTUPINFO数据结构所必需的,用于在必要时指明新应用程序的主窗口的外观。
CreateProcess
() 的最后一个参数是用于新
进程
对象及其主线程的句柄和ID的返回值缓冲区。以PROCESS_INFORMATION结构中返回的句柄调用CloseHandle() API函数是重要的,因为如果不将这些句柄关闭的话,有可能危及主创
进程
终止之前的任何未释放的资源。 2. 正在运行的
进程
如果一个
进程
拥有至少一个执行线程,则为正在系统中运行的
进程
。通常,这种
进程
使用主线程来指示它的存在。当主线程结束时,调用ExitProcess() API函数,通知系统终止它所拥有的所有正在运行、准备运行或正在挂起的其他线程。当
进程
正在运行时,可以查看它的许多特性,其中少数特性也允许加以修改。 首先可查看的
进程
特性是系统
进程
标识符 (PID) ,可利用GetCurrentProcessId() API函数来查看,与GetCurrentProcess() 相似,对该函数的调用不能失败,但返回的PID在整个系统中都可使用。其他的可显示当前
进程
信息的API函数还有GetStartupInfo()和GetProcessShutdownParameters() ,可给出
进程
存活期内的配置详情。 通常,一个
进程
需要它的运行期环境的信息。例如API函数GetModuleFileName() 和GetCommandLine() ,可以给出用在
CreateProcess
() 中的参数以
启动
应用程序。在创建应用程序时可使用的另一个
HookAPI并且在Windows程序
启动
前注入dll (C++)
这是本人用C++ 在VS2019IDE 用控制台写的一个可以在程序
启动
前注入dll 和Hook系统api的函数。Hook的是knernelbase的
CreateProcess
InternalW函数,希望对大家有帮助
Windows SDK/API
1,221
社区成员
8,136
社区内容
发帖
与我相关
我的任务
Windows SDK/API
C++ Builder Windows SDK/API
复制链接
扫一扫
分享
社区描述
C++ Builder Windows SDK/API
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章