CreateProcess创建的进程,用什么方式关闭好,怎么关?

hyz_cs 2011-05-17 09:27:04
ExitProcess应该可以,但是又不建议用.

ExitProcess   
VB声明   Declare Sub ExitProcess Lib "kernel32" Alias "ExitProcess" (ByVal uExitCode As Long)  

应尽量避免用该函数来关闭进程。不要在自己的VB程序中使用它。此时,应试着向要关闭的那个程序的主窗口投递一条WM_CLOSE消息.

...全文
1023 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
jaffy 2011-05-19
  • 打赏
  • 举报
回复
DWORD dwHandle = 0;
HANDLE hProcess1 = OpenProcess(PROCESS_CREATE_THREAD|PROCESS_VM_OPERATION|PROCESS_VM_WRITE,FALSE,dw_pid);
if(!hProcess1)
return;

//向目标进程地址空间写入DLL名称
DWORD dwSize,dwWritten;
dwSize = str_dllname.Length()+1;
LPVOID lpBuf = VirtualAllocEx(hProcess1,NULL,dwSize,MEM_COMMIT,PAGE_EXECUTE_READWRITE);

if(!WriteProcessMemory(hProcess1,lpBuf,(LPVOID)str_dllname.c_str(),dwSize,&dwWritten))
{
VirtualFreeEx(hProcess1,lpBuf,dwSize,MEM_DECOMMIT);
CloseHandle(hProcess1);
return;
}
//使目标进程调用LoadLibraryA,装载DLL
LPVOID pFun = GetProcAddress(GetModuleHandle("Kernel32"),"LoadLibraryA");
HANDLE hThread =CreateRemoteThread(hProcess1,NULL,0,(LPTHREAD_START_ROUTINE)pFun,lpBuf,0,NULL);
//等待LoadLibraryA装载完毕
WaitForSingleObject(hThread,INFINITE);
CloseHandle(hThread);
CloseHandle(hProcess1);
sczyq 2011-05-18
  • 打赏
  • 举报
回复
PROCESS_INFORMATION proc;

结束 Terminate

TerminateProcess(proc.hProcess, 1);

最后关闭 Release

CloseHandle(proc.hProcess);
CloseHandle(proc.hThread);
fxworld 2011-05-17
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 hyz_cs 的回复:]
PostThreadMessage(pi.dwThreadId ,WM_QUIT,0,0); 可以关

WM_QUIT我是不是可以换个自定义消息.实现我上面的功能,那边的程序怎么写.
[/Quote]

当然可以,参考
UINT RegisterWindowMessage( LPCTSTR lpString); 看一下msdn就明白了。
Waiting4you 2011-05-17
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 waiting4you 的回复:]

最好是让进程自己关。
如果子进程是你自己写的,可以用一些进程间通信的方法(比如共享内存,消息,管道之类的东东),向这个子进程发送消息要求关闭。
如果不是你写的,温和点的方法好像也只有向它的所有窗体发WM_CLOSE了,等指定时间还没关的话再用ExitProcess。
[/Quote]
简单一点就是用消息了,楼上的PostThreadMessage(pi.dwThreadId ,WM_QUIT,0,0)不错,不过直接发WM_QUIT可能会有问题,毕竟正常的顺序应该是窗体关完了才发送WM_QUIT的,呵呵。可以把WM_QUIT改成自定义消息,在子进程里用TApplicationEvents的OnMessage或者TApplication::OnMessage应该可以取得。
hyz_cs 2011-05-17
  • 打赏
  • 举报
回复
PostThreadMessage(pi.dwThreadId ,WM_QUIT,0,0); 可以关

WM_QUIT我是不是可以换个自定义消息.实现我上面的功能,那边的程序怎么写.
fxworld 2011-05-17
  • 打赏
  • 举报
回复
呵呵,楼主的头像咋和我的差不多。
fxworld 2011-05-17
  • 打赏
  • 举报
回复

CreatProcess 调用成功可以返回子进程的主线程句柄,

可以使用 PostThreadMessage(hChildThread,WM_QUIT,0,0)试试。
hyz_cs 2011-05-17
  • 打赏
  • 举报
回复
是自己写的.

打开的这个程序只是类似播放一个视频的功能,之所以要关闭,是因为主进程这边要求播放另一个视频(打开时会给视频的路径地址)

如果用进程间通信其实也可以不用关闭,直接发新视频的地址,让他重新播放这个视频就可以.

但还没用过进程间通信,有没有简单的例子.
Waiting4you 2011-05-17
  • 打赏
  • 举报
回复
最好是让进程自己关。
如果子进程是你自己写的,可以用一些进程间通信的方法(比如共享内存,消息,管道之类的东东),向这个子进程发送消息要求关闭。
如果不是你写的,温和点的方法好像也只有向它的所有窗体发WM_CLOSE了,等指定时间还没关的话再用ExitProcess。

13,867

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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