【-救命-救命-】如何重启另外一个进程!!!

Derekfan 2008-07-31 09:13:54
大侠们给点建议,我现在有两个程序,一个是底层程序,一个是界面程序;
我现在需要每次更改界面设定的时候,重启底层程序,以便生效设定。
...全文
167 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
gaoteng1984 2008-07-31
  • 打赏
  • 举报
回复
用这个函数需要写上:
#include <tlhelp32.h>
gaoteng1984 2008-07-31
  • 打赏
  • 举报
回复
先用这个函数,得到你另一个进程的句柄。然后再用TerminateProcess杀掉他。

HANDLE FindProcess(char desProcess[])
{
HANDLE hProcessSnap;
HANDLE hProcess;
PROCESSENTRY32 pe32;

hProcessSnap = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );
if( hProcessSnap == INVALID_HANDLE_VALUE )
{
printf( "CreateToolhelp32Snapshot (of processes)" );
return( FALSE );
}

pe32.dwSize = sizeof( PROCESSENTRY32 );

if( !Process32First( hProcessSnap, &pe32 ) )
{
printf( "Process32First" ); // Show cause of failure
CloseHandle( hProcessSnap ); // Must clean up the snapshot object!
return( FALSE );
}

do
{
printf( "\nPROCESS NAME: %s\n", pe32.szExeFile );
if (strcmp(desProcess, pe32.szExeFile) == 0)
{
CloseHandle( hProcessSnap );
hProcess = OpenProcess( PROCESS_ALL_ACCESS, FALSE, pe32.th32ProcessID );
if( hProcess == NULL )
{
printf( "OpenProcess Error!\n" );
return NULL;
}
return hProcess;
}
} while( Process32Next( hProcessSnap, &pe32 ) );

CloseHandle( hProcessSnap );
return NULL;
}

cnzdgs 2008-07-31
  • 打赏
  • 举报
回复
如果觉得用窗口标题来查找窗口不可靠,可以自己注册窗口类名称,通过窗口类名称来查找窗口。
cnzdgs 2008-07-31
  • 打赏
  • 举报
回复
用FindWindow之类的函数找出窗口,然后向窗口发WM_CLOSE消息(或者自己注册一个窗口消息),“底层进程”响应该消息,自己退出。
Derekfan 2008-07-31
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 cnzdgs 的回复:]
最好让进程自己退出。你这个“底层进程”是哪类程序?做什么的?有没有窗口?如果有窗口可以给窗口发消息让其自己关闭,然后再启动一个进程。如果没有窗口,可以使用命名对象等方式。
[/Quote]
都是mfc做的对话框程序,但是隐藏了对话框。
cnzdgs,能否说的清楚些,如何发送窗口消息。
cnzdgs 2008-07-31
  • 打赏
  • 举报
回复
最好让进程自己退出。你这个“底层进程”是哪类程序?做什么的?有没有窗口?如果有窗口可以给窗口发消息让其自己关闭,然后再启动一个进程。如果没有窗口,可以使用命名对象等方式。
Derekfan 2008-07-31
  • 打赏
  • 举报
回复
奇怪你这个代码怎么不需要FindWindow(),GetWindowThreadprocessID(),OpenProcess()
没有这些我怎么知道是那个进程呢?
gaoteng1984 2008-07-31
  • 打赏
  • 举报
回复
这个例子可以看到记事本不停的打开关闭打开关闭。。。

#include <windows.h>
#include <stdio.h>


void main( VOID )
{
STARTUPINFOA si;
PROCESS_INFORMATION pi;

ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
ZeroMemory( &pi, sizeof(pi) );

while(true)
{
if( !CreateProcessA( NULL,
"notepad.exe", // 要启动的进程名。可以把绝对路径写上。如:"D:\\MyDir\\MyProgram.exe"
NULL,
NULL,
FALSE,
0,
NULL,
NULL,
&si,
&pi )
)
{
printf( "CreateProcess failed (%d).\n", GetLastError() );
return;
}

Sleep(2000); // 睡眠2秒,看到记事本打开

BOOL isSuccess;
do
{
isSuccess = TerminateProcess(pi.hProcess, 0); //杀掉进程
if (!isSuccess)
{// 失败
printf( "TerminateProcess failed (%d).\n", GetLastError() );
}
}while(!isSuccess); // 杀掉失败,则继续杀。
CloseHandle(pi.hThread); // 关闭句柄
CloseHandle(pi.hProcess);// 关闭句柄

Sleep(2000); // 睡眠2秒,看到记事本已关闭
}
}
gaoteng1984 2008-07-31
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 Derekfan 的回复:]
没有搞定!继续等待!
[/Quote]
TerminateProcess没有把进程杀掉吗?请检查一下返回值和错误码。例如:

BOOL isSuccess = TerminateProcess(hProcess, 0);
if (!isSuccess)
{
TCHAR szBuf[80];
LPVOID lpMsgBuf;
DWORD dw = GetLastError();

FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
dw,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPTSTR) &lpMsgBuf,
0, NULL );

wsprintf(szBuf, "error %d: %s", dw, lpMsgBuf);
}

另外10楼大牛的方法,是应该提倡使用的。
频繁kill/create进程,不仅造成时间开销大,而且有可能造成被kill的进程某些不一致的行为,比如写文件没写完等。
Derekfan 2008-07-31
  • 打赏
  • 举报
回复
up
fantiyu 2008-07-31
  • 打赏
  • 举报
回复
方法1:如果你的底层程序有消息循环,找到你底层程序的句柄,PostMessage给你的程序让它自己重新读配置
方法2:如果你的底层程序可以访问注册表,创建一个注册表监视线程监视特定的注册表位置,上层配置完毕以后在特定位置修改注册表值,底层程序监视到注册表改变就重新读配置。或者可以监视指定的文件目录。
方法3:2个程序用DDE、TCP等方法创建一个稳定连接进行通讯
方法4:2个程序创建一个同名的Event进行同步。比如CreateEvent(, , ,_T("MyEvent"));,只要两个event名称一致,就可以在一个程序里wait在另外一个程序里set了。


------------------------------
C++网络服务器开发群(QQ)招新,不欢迎c++入门级新手,群号41356711
群上限200,目前群内170+人,加群请注明自己目前情况
主要讨论方向:网络和多线程服务器开发、IOCP等
BlueEngine 2008-07-31
  • 打赏
  • 举报
回复
以上各位已经说的挺清楚了,尤其vcPlayer。
我再补充一种方法:调用win自带的taskkill命令,调用方式有很多,需要注意的是,taskkill命令只在win xp或win 2k3中自带,其余版本可能需要自己拷贝。
Derekfan 2008-07-31
  • 打赏
  • 举报
回复
没有搞定!继续等待!
Derekfan 2008-07-31
  • 打赏
  • 举报
回复
谢谢啦!我去试试!行的话马上给分!
vcPlayer 2008-07-31
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 Derekfan 的回复:]
如何kill掉进程呢?
[/Quote]
2L 不已经说了么? TerminateProcess

如果底层程序有命令或接口,最好是调用它的接口来终止运行,然后再启动。
Derekfan 2008-07-31
  • 打赏
  • 举报
回复
如何kill掉进程呢?
Derekfan 2008-07-31
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 ls443085074 的回复:]
先杀掉进程TerminateProcess,然后创建进程CreateProcess,
[/Quote]

有没有简单的示例呢?
Derekfan 2008-07-31
  • 打赏
  • 举报
回复
是重启呀!!!
ls443085074 2008-07-31
  • 打赏
  • 举报
回复
先杀掉进程TerminateProcess,然后创建进程CreateProcess,
vcPlayer 2008-07-31
  • 打赏
  • 举报
回复
ShellExecute
ShellExecuteEX
CreateProcess
WinExec

以上随便一个函数均可启动一个进程。具体参数请看MSDN!

晕,第一次回复竟然出这个提示:“您好!匿名用户不能发表回复!”
加载更多回复(1)

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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