500分讨论.客户端如何知道中间层已经关闭?好像还没什么好的方法.(200分)

  • 主题发起人 主题发起人 marknew
  • 开始时间 开始时间
我也遇到这样的问题!
只是给客户说重新启动服务。
具体判断没有做到,只是提示!
楼上的 初不 :说的很好
支持!
 
以前我们在服务器端做了一个中间层监控程序,专门防止一些不稳定因数让服务器关系。
这个监控当然可以定时查询,中间层的进程是不是存在,不存在你可以启动
判断进程是不是存在用下面函数
uses Tlhelp32,shlobj
function TEujavaDcom.Me_SearchProcessName(ExeFileName: String): String;
const
PROCESS_TERMINATE=$0001;
//进程的PROCESS_TERMINATE访问权限
var
ContinueLoop: BOOL;
FSnapshotHandle: THandle;
FProcessEntry32: TProcessEntry32;
begin
Result:= '';
FSnapshotHandle := CreateToolhelp32Snapshot
(TH32CS_SNAPPROCESS, 0);
//获取系统所有进程快照
FProcessEntry32.dwSize := Sizeof(FProcessEntry32);
//调用Process32First前用Sizeof(FProcessEntry32)填充FProcessEntry32.dwSize
ContinueLoop := Process32First(FSnapshotHandle,
FProcessEntry32);
//获取快照中第一个进程信息并保存到FProcessEntry32结构体中
while integer(ContinueLoop) <> 0do
//循环枚举快照中所有进程信息
begin
if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile))= UpperCase(ExeFileName)) OR
(UpperCase(FProcessEntry32.szExeFile) = UpperCase(ExeFileName))) then
begin
Result := ExeFileName;
end;
ContinueLoop := Process32Next(FSnapshotHandle,FProcessEntry32);
end;
end;
应用
V_ExeExist :=Me_SearchProcessName('exp.exe');
if V_ExeExist <> '' then
begin
O_Result :='[导出程序]已经在执行,请先关闭[导出程序]';
exit;
end;
 
关注一下的。

 
这倒是一个办法.但我测试了,还是有问题.中间层手工关闭后再重新启用,客户端依然会报连接已断开,RPC服务器不可用的错误.
只好这样了,在Application.OnException中进行全局处理,也算能解决问题.
try
...
except
on E: EOleSysError do
begin
if (EOleSysError(E).ErrorCode = -2147417848) or
(EOleSysError(E).ErrorCode = -2147023174) then
begin
DMCom.BrkServer.Connected := false;
DMCom.BrkServer.Connected := true;
ShowMessage('请重新执行刚才的操作!')
end;
end;
 
查看中间层的端口是否打开
用socket连接 这样可以获得中间层什么时候断开的消息。
 
问题基本搞定了.怎么发500分呀?
 
哈,是不是分数太多了。
可以给我呀。[:)]
 
没回答问题的没份!
 
我也回答了呀。
这么小气呀,55555555
 
好像還沒討論中間層是soap的,然後客戶端是網頁的方式吧。這些又有不同了。
 
分分算了。先这么多吧,改不了500分,下次放在其它就可以1000分了
 
后退
顶部