怎么用c++编写一个Windows服务程序来监控另一个程序,崩溃后重新启动。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了怎么用c++编写一个Windows服务程序来监控另一个程序,崩溃后重新启动。相关的知识,希望对你有一定的参考价值。

mfc可以的
很多windows程序都是用mfc开发的
建立工程的时候应该有一个选项
是单文档
对话框
还是多文档
比如你选了对话框
建立完成后你在左侧资源(resources)选项里可以找到你的对话框(反正你就一个一个的双击,总有一个是)
右侧会有一个工具条
可以往上托控件
而且控件可以自己添加
具体的你自己试试吧
参考技术A c++或者java
都有方法能控制电脑进程,可以根据监控程序进程来进行重启

可以百度(c++
如何查看电脑进程并重新启动)

用windows API 编写一个C++窗口

#include <windows.h>

LRESULT CALLBACK WindowSunProc( HWND hwnd, // handle to window
UINT uMsg, // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
);
int WINAPI WinMain(
HINSTANCE hInstance, // handle to current instance
HINSTANCE hPrevInstance, // handle to previous instance
LPSTR lpCmdLine, // command line
int nCmdShow // show state
)

WNDCLASS wndCls;
wndCls.cbClsExtra = 0;
wndCls.cbWndExtra = 0;
wndCls.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
wndCls.hCursor = LoadCursor(NULL,IDC_CROSS);
wndCls.hIcon = LoadIcon(NULL,IDI_APPLICATION);
wndCls.hInstance = hInstance;
wndCls.lpfnWndProc = WindowSunProc;
wndCls.lpszClassName = NULL;
wndCls.lpszMenuName = NULL;
wndCls.style = CS_HREDRAW | CS_VREDRAW;
RegisterClass(&wndCls);

HWND hwnd;
hwnd = CreateWindow("123","456",WS_OVERLAPPEDWINDOW,100,100,500,600,NULL,NULL,hInstance,NULL);
ShowWindow(hwnd,SW_SHOWNORMAL);
UpdateWindow(hwnd);

MSG msg;
while(GetMessage(&msg,NULL,0,0))
TranslateMessage(&msg);
DispatchMessage(&msg);


return 0;

LRESULT CALLBACK WindowSunProc( HWND hwnd, // handle to window
UINT uMsg, // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
)
/*响应各种消息*/
return 0;

编译连接能通过 为啥执行程序 啥都不给我显示? 不是应该出一个窗口么?

我是以前干JAVA的 初学这玩意儿 勉强能看懂代码的意思 但是不知道怎么解决这个问题 求指导
如果单纯只要出个窗口 或者在窗口里面画点乱七八糟的东西,不涉及事件驱动的情况下,应该不需要创建MSG引用吧?直接在WinMain里面放几个画东西的方法就好了吧?

1、wndCls.lpszClassName = NULL; <- 首先,这个,你不给类的名字,这个类肯定是注册失败了
2、hwnd = CreateWindow("123","456",WS_OVERLAPPEDWINDOW,100,100,500,600,NULL,NULL,hInstance,NULL);
<- 因为不存在类 123,所以这里创建不出窗口
3、while(GetMessage(&msg,NULL,0,0)) <- 因为没有任何窗口,所以这个线程接收不到任何消息,程序就永远卡死在这里
4、/*响应各种消息*/
return 0; <- 没有任何消息响应,甚至连窗口关闭以后也不会PostQuitMessage,所以前面那个GetMessage是不会返回0的,就算关闭了窗口程序也不会退出追问

非常感谢您的回答,很到位,很对口,一看就是用心了的姐姐···
我说为啥新建个wndCls对象居然和新建的窗口半毛钱关系都没有 原来是在这个className上关联上了
还有两个问题请教
1.原始问题里面说的
如果单纯只要出个窗口 或者在窗口里面画点乱七八糟的东西,不涉及事件驱动的情况下,应该不需要创建MSG引用吧?造好窗口后,直接在WinMain里面放几个画东西的方法就好了吧?(字数 评论)

追答

1、话说什么叫MSG引用……我没懂

2、在WinMain里放几个画东西的方法是不够的,因为画上去以后,别的窗口来挡一下,然后再把别的窗口拉走;或者最小化再恢复,画的东西就没掉了,甚至可能系统自己刷新了一下你的窗口,画的东西就没掉了:因为系统不会保存窗口上画的东西,每次刷新都要你重新画的。

3、不会帮你初始化

4、注释你一时这么说我也不知道该注哪里……

5、不是姐姐……

6、补充一下,下面那个你说链接没通过的,就是我说程序永远卡在那边不会退出的。你到任务管理器里面把你运行的那个进程给结束了,不然重启之前链接都不会通过

追问

Linking
LINK fatal error LNK1168: cannot open Debug/Win32Application.exe for writing
Error executing link.exe.
Win32Application.exe - 1 error(s), 0 warning(s)
代码我会好好研究 我也相信没有错 但是链接就是不过 = =!

参考技术A 这个,你还要响应各种必要的消息。如:WM_PAINT,WM_CLOSE,WM_DESTORY等消息
其次,在WM_PAINT函数中,你还必须写上关于dc的那一部分,不然就显示不了的。
参考技术B 给你一段完整的code:

#include <windows.h>
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)

static TCHAR szAppName[] = TEXT ("HelloWin") ;
HWND hwnd ;
MSG msg ;
WNDCLASS wndclass ;
wndclass.style = CS_HREDRAW | CS_VREDRAW ;
wndclass.lpfnWndProc = WndProc ;
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = 0 ;
wndclass.hInstance = hInstance ;
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
wndclass.lpszMenuName = NULL ;
wndclass.lpszClassName = szAppName ;
if (!RegisterClass (&wndclass))

MessageBox ( NULL, TEXT ("This program requires Windows NT!"),
szAppName, MB_ICONERROR) ;
return 0 ;

hwnd = CreateWindow( szAppName, // window class name
TEXT ("The Hello Program"), // window caption
WS_OVERLAPPEDWINDOW, // window style
CW_USEDEFAULT, // initial x position
CW_USEDEFAULT, // initial y position
CW_USEDEFAULT, // initial x size
CW_USEDEFAULT, // initial y size
NULL, // parent window handle
NULL, // window menu handle
hInstance, // program instance handle
NULL) ; // creation parameters

ShowWindow (hwnd, iCmdShow) ;
UpdateWindow (hwnd) ;

while (GetMessage (&msg, NULL, 0, 0))

TranslateMessage (&msg) ;
DispatchMessage (&msg) ;

return static_cast<int> (msg.wParam) ;

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)

HDC hdc ;
PAINTSTRUCT ps ;
RECT rect ;

switch (message)

case WM_CREATE:
//PlaySound (TEXT ("hellowin.wav"), NULL, SND_FILENAME | SND_ASYNC) ;
MessageBox (NULL, TEXT ("Hello, Windows 98!"), TEXT ("HelloMsg"), 0);
return 0 ;
case WM_PAINT:
hdc = BeginPaint (hwnd, &ps) ;

GetClientRect (hwnd, &rect) ;

DrawText (hdc, TEXT ("Hello, Windows 98!"), -1, &rect,
DT_SINGLELINE | DT_CENTER | DT_VCENTER) ;
EndPaint (hwnd, &ps) ;
return 0 ;

case WM_DESTROY:
PostQuitMessage (0) ;
return 0 ;

return DefWindowProc (hwnd, message, wParam, lParam) ;
追问

编译过了 链接没过
Linking...
LINK : fatal error LNK1168: cannot open Debug/Win32Application.exe for writing
Error executing link.exe.
Win32Application.exe - 1 error(s), 0 warning(s)

追答

要在工程中添加相关lib文件

以上是关于怎么用c++编写一个Windows服务程序来监控另一个程序,崩溃后重新启动。的主要内容,如果未能解决你的问题,请参考以下文章

java如何实现对windows系统和Tomcat服务器进行监控

用啥软件来查看一个用Microsoft Visual C++ 6.0 编写的程序的源代码

用windows API 编写一个C++窗口

c++程序中,无法识别中文路径怎么办

怎么用C或C++来编写一个抓包程序,或者是编写一个能够保存抓出的包然后分析出结果的程序,要个思路!

用C语言编写Windows服务程序的五个步骤