郁闷!!监测程序的运行出现的问题(100分)

  • 主题发起人 主题发起人 fujtao
  • 开始时间 开始时间
F

fujtao

Unregistered / Unconfirmed
GUEST, unregistred user!
有一个要求24小时运行的程序,为了避免用户关闭或程序自身异常退出,我写了一个服务监测程序的运行,定时30秒用Findwindow函数查找主窗口.结果在家里每台机器上都没问题.而在客户(距离很远)那边运行就30秒弹出一个运行,即Findwindow没起作用.没得办法,我修改主程序,每10秒修改注册表中一个当前时间值.而服务每30秒检测该值,在家里可以,在客户那边一样30秒弹出一个运行.好郁闷.
 
是不是别的什么问题呀!给他远程控制一下看看!
 
因为操作系统?最好是亲自去调试一次!
 
把服务停止,程序运行正常,不是客户程序的问题,好象跟操作系统无关,我在家里试了几种操作系统.
 
别用FINDWINDOW
用进程守护,我也正研究这个课题,无法给你进一步的信息
 
能把你服务的代码贴出来吗
 
关键代码
procedure TMyThread.Execute;
var
h:hwnd;
begin

while not Terminateddo
begin
Sleep(1000);
if TimeFlag then
begin
h:=Findwindow('TMain_Form',nil);
ifrun:=(h=0);
TimeFlag:=False;
end;
if ifrun then
begin
try
wlkj_Service.RunProgram;
except
end;
ifrun:=False;
end;

end;
end;
 
procedure TMyThread.Execute;
var
h:hwnd;
begin
while not Terminateddo
begin
Sleep(30000);
h:=Findwindow('TMain_Form',nil);
if h<=0 then
wlkj_Service.RunProgram;

end;
end;
 
做成象 杀毒软件 那样的 ,不能杀掉进程的。
 
sefeng1982,不能做成杀毒软件,我自己出现某些错误要退出,
boy2002cn,我开始的判断条件是h<1 ,情况是一样的,会每隔30秒不断运行程序,关键是
Findwindow没起作用
 
我想是因为服务的登录身份问题
因为服务和你运行的程序在不同的用户空间里运行,像窗口句柄,互斥对象等等都是独立的,并不能相互访问,所以FindWindow不能成功.
解决方法:
1.用当前登录的用户身份启动服务
2.程序运行后打开一个端口,服务也不断尝试去打开同一端口,如果服务能成功打开端口则是程序没运行.
3.用其它不依赖用户空间的对象判断
 
轻舞肥羊: 我是用当前登录的用户身份启动服务,我尝试用注册表中建一个时间字段来判断也没有成功,不过你说的第2个解决方法我可尝试一下.可能可以解决.顺便说一句,客户是铁路,点较多,大部分点不行,在家里怎么做都正常.呵呵
 
在服务属性里把允许服务与桌面交互勾上就行了
 
想到了一个方法,用要检测那个程序CreateMutex,在服务中定时检测就行了,只要在一个桌面上是不可能检测不到的,窗口有时是会检测不到,CreateMutex不会检测不到的
 
sorry,昨天我去现场去了一下,不是FINDWINDOW的问题,是服务调用程序时出错,其弹出错误信息为:
程序错误
xxx.exe 产生了错误,会被WINDOWS 关闭.您需要
重新启动程序.
正在创建错误日志.
|确定|
 
to foye:允许与桌面交负是必须的,我已勾了
 
服务中写
procedure TMyThread.Execute;
while truedo
begin
sleep(30000);
CreateMutex(nil,False,'我要检测');
If ERROR_ALREADY_EXISTS<>GetLastError then
 wlkj_Service.RunProgram;
end;
end;
程序中在Application.CreateForm(TMain, Main);前写
CreateMutex(nil,False,'我要检测');
 
现在是在RunProgram时出错
 
是不是xp或者2003系统,出现上述问题可能是需要注册的东东没有成功,手工再注册试试
 
后退
顶部