如何判断用CreateProcess启动的进程已经启动完成?

MarsChen 2002-10-21 10:43:36
我用CreateProcess执行一个Exe文件,接着就要用EnumWindows来查找该进程的主窗口Hwnd,
可是我发现如果一执行完CreateProcess就执行EnumWindows则肯定查不到该进程的主窗口Hwnd;如果中间加一延时(2s)就可以

CreateProcess不会是异步执行的吧?我怎么才能知道被启动的进程已经创建好了主窗体呢?用这种延时的办法总不太好

请高手指教,多谢!
...全文
1296 19 打赏 收藏 转发到动态 举报
写回复
用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,但实际上该进程的主窗体并未创建成功

有没有人碰到过同样的问题?能指点一下么?
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() 中的参数以启动应用程序。在创建应用程序时可使用的另一个

1,221

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧