如何用程序控制一个服务的启动,关闭,象SQLSERVER的SERVER MANAGER(100分)

  • 主题发起人 主题发起人 一剑封喉
  • 开始时间 开始时间
:DragonPC_???兄,你说的我还是不明白,这是怎么调用注册呀,麻烦你说的明白点
分数无所谓,因为我现在很急的呀,顺便问一句,这里的消息是怎样发出去的呀,我的OICQ是
23066884,请多指教。
 
兄弟需要补课了,我一下子还真没有办法和你说清楚,我公司封了端口,玩不了OICQ[:(]
 
当然,我不会不管你,
这样吧,记住,在你的unit的type部分,加入这行
function RegisterServiceProcess(a:longint;const b:longint):dword;stdcall;far;external 'Kernel32.dll' name 'RegisterServiceProcess';

在FormCreate过程里面加入
if (RegisterServiceProcess(GetCurrentProcessId, 1)=0) then
;showmessage('error!');

运行,试试
 
没有关系,对了,:DragonPC_???兄,你说在98下,将程序打到注册表中是不是也可以呀
,关键我现在的程序即SERVICE在2000下已经能够用了,可是到了98下就不知道该怎么办了
难道说启动就要启动可执行文件不成,那就没有什么意思了。你说是不是。
 
:DragonPC_???兄,不好意思,刚刚看到你的回复,我在TYPE中加入后,系统提示错误
Field definition not allowed after methods or properties,好象不太识别这样
的函数,因为它后面跟着几个;号。请指教
 
天哪,给你气死了[:(!](开玩笑,不要当真)
NT 下面不能运行的,因为'Kernel32.dll没有这个函数,请照抄下列代码
(以下为Delphi6代码,Delphi5的uses part稍有不同)
*****************************************************************
unit Unit1;

interface

uses
; Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
; Dialogs, StdCtrls;

type
; TForm1 = class(TForm)
; ; Button1: TButton;
; ; procedure Button1Click(Sender: TObject);
; ; procedure FormCreate(Sender: TObject);
; private
; ; { Private declarations }
; public
; ; { Public declarations }
; end;

; function RegisterServiceProcess(a:longint;const b:longint):dword;stdcall;far;external 'Kernel32.dll' name 'RegisterServiceProcess';

var
; Form1: TForm1;

implementation

{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
; RegisterServiceProcess(GetCurrentProcessId, 1) ;
end;

end.
 
to 一剑封喉:
我看了也觉得气[:D]
RegisterServiceProcess的用法这样的相关帖子大富翁里有不少,你干吗不先搜搜呢。
再有,你到底想做什么东东呢?你用个具体点儿的例子一步步地说说好不好。
 
DragonPC_???兄,用RegisterServiceProcess怎样能够处理我要做的程序呢?能不能再详细一点
小弟实在比较笨,比如说我有个应用程序在98下,你怎么实现呢?
 
5rain6sky兄,DragonPC_???兄多谢你们的关心,不过主要因为小弟才疏学浅。多有得罪。
请多关照。
如果让你们做这个SERVICE MANAGER的话,你们应该怎样做呢?

下面是我要实现的目标:
一个SERVICE MANAGER 同时实现在98下和2000下实现对服务的启动,停止,暂停
但是前提先做一个服务,在2000下,服务已经做完,而且对服务的控制小弟听完5rain6sky兄
的做法已经实现,不过现在难点就是在98下怎样生成服务和对服务的控制,而且这个程序
要做成通用的在98和2000都能执行,所以小弟现在有点不明白。
98下的服务如果用 RegisterServiceProcess做的话,那它在2000下又不行,所以这就增加了
问题的难度,请各位多多考虑,帮忙帮到底,分数绝对没有问题。
 
首先我想弄明白的是你把它作成服务是为了什么?
如果你要利用服务本身的安全性等特性,我劝你还是放弃98下的努力,
因为你就算做成了通用的“服务”控制程序,在98下也得不到实际的好处。
如果你只是想让你的程序在98和2000下有一个公用的接口界面,我劝你不要做成服务程序,
当然你的后台程序可以称之为“服务”程序,但这个“服务”就是相对于客户或是依赖它
的程序的这样一种概念而不是技术上的windows系统服务,这同样是因为98下根本就没这回事儿。

所以你现在要做的是做一个普通的应用程序,给它加上可以接收“暂停”、“继续”等参数的接口。
比如你这个程序名是a.exe,你要先把它做成可以通过从命令行打“a.exe -start”启动执行;
在运行过程中再打“a.exe -pause”的时候它可以找到正在运行的程序的实例,并通知它“暂停”;
最终可以用“a.exe -stop”命令让同一个程序退出;这就行了。
就是说为了也能在98下执行,这个普通程序必须自己模拟2000下服务程序的行为。

然后你的控制程序也就简单了,用WinExec就可以控制了。
至于返回的状态你可以通过文件或是注册表来取得。
这样的话,整个系统的难点也就在于参数的接收了,最难的其实是怎么找到已经运行的程序。
这个问题可以考虑用Mutex吧,我也拿不准,你可以好好查查资料先。
 
5rain6sky兄,你的想法很好,不过现在我要实现的就是要用一个程序同时能够在2000和98下
运行服务的停止和启动,因为这是任务,呵呵,在2000下到是不必说了,已经完成,但是
在98下要运行所谓的服务,就有点难度,因为这种服务是虚拟的东西,但是我想既然SQLSERVER
能够实现在98下和2000都能做服务的启动和停止,我们就能做,不对吗?所以还望各位多多帮助。
 
5rain6sky兄,你说的a.exe -stop 和 ;a.exe-pause 在98下运行怎么不好使呢?
而且怎样使这个可执行文件不SHOW的运行呢?用SW_HIDE不好使,能不能再帮我一次呢?
 
为什么不说话,朋友们,难道我是太差了吗
 
不好使那得问你呀,你没仔细看我上个帖子吧,我说的是[red]你[/red]要把它[red]做成[/red]可以带参数执行的。
也就是说在98下,“-stop”、“-pause”这些参数需要你自己在这个程序里接收并处理。
我只是为了方便,恰好用了这些习惯的单词,这可能让你有所误会,你也可以把-pause写成-p
或是-ppp,随便什么,这些都是由你来定,也是由你自己的控制程序使用的。

你是说用WinExec加SW_HIDE参数不能使程序隐藏执行?还能看到主窗口?怪事。
不行就在Applicaton.Run;之前加一句Application.ShowMainForm := False;试试。
 
:5rain6sky兄,那你看我应该怎样在控制程序中控制我的SERVER程序启动,停止,和暂停呢?
因为他们是两个程序,如果把这两个程序合在一起我是能实现,不过这样以来,在2000下好象不
能实现,因为SERVER程序在2000下是要做成SERVICE的,所以不知道在98下要怎样使这两个程序
合作起来呢?我是说加参数的问题。不好意思,这个问题麻烦你很久。让您费心了。
 
我来说两句。
一剑封喉,你说你要在控制程序中控制你的SERVER程序启动,停止,和暂停。好,假如说
你的控制程序叫kz.exe,你的SERVER程序叫fw.exe。你想通过kz.exe -start来启动,
kz.exe -pause来暂停,kz.exe -stop来停止你的服务。可以这样,当命令行敲入
kz.exe -start时,先检测fw.exe运行了没有(因为是两个程序,所以在fw.exe中可以通过
增加系统原子Atom来识别fw.exe运行与否,这方面手段应该是很多的),如果运行了,就
不再启动服务,否则运行之;现在服务运行了,接下来就是暂停。你要你的服务暂停,
完全可以通过发送消息的方法来实现。当命令行敲入kz.exe -pause的时候,你的kz.exe
发送一个消息给fw.exe,当然这消息必须是在kz.exe,fw.exe中注册的相同名称的“自定义
系统消息”,当fw.exe收到控制程序发送来的暂停消息后,你就可以叫你的fw.exe暂停
下来了。同理,可叫你的fw.exe停止。不知道符不符合你 的 要求。
 
:刘李子兄,那么怎么样在两个程序中自定义消息以便一个程序能够呢?请详细的说,小弟实在是
才疏学浅。最好举个例子,好吗?
 
一剑封喉,接着:
1.基础:
The RegisterWindowMessage function defines a new window message that is guaranteed to be unique throughout the system. The returned message value can be used when calling the SendMessage or PostMessage function.

UINT RegisterWindowMessage(

; ; LPCTSTR lpString // address of message string
; ;);
;

Parameters

lpString

Points to a null-terminated string that specifies the message to be registered.

;

Return Values

If the message is successfully registered, the return value is a message identifier in the range 0xC000 through 0xFFFF.
If the function fails, the return value is zero.

Remarks

The RegisterWindowMessage function is typically used to register messages for communicating between two cooperating applications.
If two different applications register the same message string, the applications return the same message value. The message remains registered until the Windows session ends.
Only use RegisterWindowMessage when more than one application must process the same message. For sending private messages within a window class, an application can use any integer in the range WM_USER through 0x7FFF. (Messages in this range are private to a window class, not to an application. For example, predefined control classes such as BUTTON, EDIT, LISTBOX, and COMBOBOX may use values in this range.)

2.代码实例:This application sends the message:

procedure TForm1.FormCreate(Sender: TObject);
begin
; {register the user defined message}
; UserMessage := RegisterWindowMessage('System Wide User Defined Message');
end;

procedure TForm1.Button1Click(Sender: TObject);
var
; ReturnValue: LRESULT; ; // holds the result returned by SendMessage
begin
; {send the user defined message to the specified window}

; ReturnValue := SendMessage(FindWindow('TForm1','RegisterMessage Get Example'),
; ; ; ; ; ; ; ; ; ; ; ; ; ; ;UserMessage, 0, 0);

; {display the result of the message processing}
; Button1.Caption := 'SendMessage Result: '+IntToStr(ReturnValue);
end;

and this application receives it:

procedure TForm1.DefaultHandler(var Msg);
begin
; {allow default message handling to occur}
; inherited DefaultHandler(Msg);

; {if the user defined message was recieved...}
; if (TMessage(Msg).Msg=UserMessage) then
; begin
; ; {...send a reply. this causes the message to return
; ; ;immediately if sent by one of the SendMessage functions}
; ; ReplyMessage(5);

; ; {enable the timer and turn on a user interface object}
; ; Timer1.Enabled := TRUE;
; ; Label2.Visible := TRUE;

; ; {indicate if the message was sent via one of the SendMessage functions}

; ; if InSendMessage then Label3.Visible := TRUE;
; end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
; {register the system wide user defined message}
; UserMessage := RegisterWindowMessage('System Wide User Defined Message');
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
; {turn off the user interface elements after one second}

; Timer1.Enabled := FALSE;
; Label2.Visible := FALSE;
; Label3.Visible := FALSE;
end;

The Tomes of Delphi 3: Win32 Core API Help File by Larry Diehl

3.请认真阅读,理解。:)
 
我要吃饭去了,饿扁我了。
一剑封喉,你还是多看一下 WIN32 PROGRAMMER‘S REFERENCE,在DELPHI的MS SDK目录下
有,多多看帮助,绝对有好处!:)
吃完饭再聊。
 
现在我都有点蒙了,到底在98下怎么样才能做到象SQLSERVER那样的98单机版上的服务管理器
,随意的控制98下的SQLSERVER的启动,暂停,和停止,再加200分,请各位给个详细的方案。
 
后退
顶部