网上抄的ServiceApplication的例子
代码:
TService:unit Unit1;interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs,
Unit2, ActiveX;type
TzcServiceDemo = class(TService)
procedure ServiceContinue(Sender: TService; var Continued: Boolean);
procedure ServiceExecute(Sender: TService);
procedure ServicePause(Sender: TService; var Paused: Boolean);
procedure ServiceShutdown(Sender: TService);
procedure ServiceStart(Sender: TService; var Started: Boolean);
procedure ServiceStop(Sender: TService; var Stopped: Boolean);
private
{ Private declarations }
public
function GetServiceController: TServiceController; override;
{ Public declarations }
end;var
zcServiceDemo: TzcServiceDemo;implementation{$R *.DFM}procedure ServiceController(CtrlCode: DWord); stdcall;
begin
zcServiceDemo.Controller(CtrlCode);
end;function TzcServiceDemo.GetServiceController: TServiceController;
begin
Result := ServiceController;
end;procedure TzcServiceDemo.ServiceContinue(Sender: TService;
var Continued: Boolean);
begin
while not Terminated do
begin
Sleep(10);
ServiceThread.ProcessRequests(False);
end;
end;procedure TzcServiceDemo.ServiceExecute(Sender: TService);
begin
while not Terminated do
begin
Sleep(10);
ServiceThread.ProcessRequests(False);
end;
end;procedure TzcServiceDemo.ServicePause(Sender: TService;
var Paused: Boolean);
begin
Paused := True;
end;procedure TzcServiceDemo.ServiceShutdown(Sender: TService);
begin
g_bCanClose := true;
FrmMain.Free;
Status := csStopped;
ReportStatus();
end;procedure TzcServiceDemo.ServiceStart(Sender: TService;
var Started: Boolean);
begin
Coinitialize(nil);
Started := True;
Svcmgr.Application.CreateForm(TFrmMain, FrmMain);
g_bCanClose := False;
FrmMain.Hide;
end;procedure TzcServiceDemo.ServiceStop(Sender: TService;
var Stopped: Boolean);
begin
Stopped := True;
g_bCanClose := True;
FrmMain.Free;
CoUninitialize;
end;end.
TForm:unit Unit2;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls,
ShellApi, DB, ADODB;const
WM_TrayIcon = WM_USER + 1234;type
TFrmMain = class(TForm)
Timer1: TTimer;
Button1: TButton;
ADOConnection1: TADOConnection;
Button2: TButton;
Button3: TButton;
Memo1: TMemo;
procedure FormCreate(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure FormDestroy(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
FIconData: TNotifyIconData;
procedure AddIconToTray;
procedure DelIconFromTray;
procedure TrayIconMessage(var Msg: TMessage); message WM_TrayIcon;
procedure SysButtonMsg(var Msg: TMessage); message WM_SYSCOMMAND;
public
{ Public declarations }
end;var
FrmMain: TFrmMain;
g_bCanClose: Boolean;implementation{$R *.dfm}procedure TFrmMain.AddIconToTray;
begin
ZeroMemory(@FIconData, SizeOf(TNotifyIconData));
FIconData.cbSize := SizeOf(TNotifyIconData);
FIconData.Wnd := Handle;
FIconData.uID := 1;
FIconData.uFlags := NIF_MESSAGE or NIF_ICON or NIF_TIP;
FIconData.uCallbackMessage := WM_TrayIcon;
FIconData.hIcon := Application.Icon.Handle;
FIconData.szTip := 'Delphi服务演示程序';
Shell_NotifyIcon(NIM_ADD, @FIconData);
end;procedure TFrmMain.DelIconFromTray;
begin
Shell_NotifyIcon(NIM_DELETE, @FIconData);
end;procedure TFrmMain.SysButtonMsg(var Msg: TMessage);
begin
if (Msg.wParam = SC_CLOSE) or (Msg.wParam = SC_MINIMIZE) then
Hide
else
inherited; // 执行默认动作
end;procedure TFrmMain.TrayIconMessage(var Msg: TMessage);
begin
if (Msg.LParam = WM_LBUTTONDBLCLK) then Show();
end;procedure TFrmMain.Timer1Timer(Sender: TObject);
begin
AddIconToTray;
end;// *******************************************************************************************procedure TFrmMain.FormCreate(Sender: TObject);
begin
// FormStyle := fsStayOnTop; {窗口最前}
SetWindowLong(Application.Handle, GWL_EXSTYLE, WS_EX_TOOLWINDOW); {不在任务栏显示}
g_bCanClose := False;
Timer1.Interval := 1000;
Timer1.Enabled := True;
AddIconToTray;
end;procedure TFrmMain.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
CanClose := g_bCanClose;
if not CanClose then
begin
Hide;
end;
end;procedure TFrmMain.FormDestroy(Sender: TObject);
begin
Timer1.Enabled := False;
DelIconFromTray;
end;// *******************************************************************************************procedure SendHokKey;stdcall;
var
HDesk_WL: HDESK;
begin
HDesk_WL := OpenDesktop ('Winlogon', 0, False, DESKTOP_JOURNALPLAYBACK);
if (HDesk_WL <> 0) then
if (SetThreadDesktop (HDesk_WL) = True) then
PostMessage(HWND_BROADCAST, WM_HOTKEY, 0, MAKELONG (MOD_ALT or MOD_CONTROL, VK_DELETE));
end;procedure TFrmMain.Button1Click(Sender: TObject);
var
dwThreadID : DWORD;
begin
CreateThread(nil, 0, @SendHokKey, nil, 0, dwThreadID);
end;procedure TFrmMain.Button2Click(Sender: TObject);
begin
try
ADOConnection1.Connected:=true;
except on E:Exception do
Memo1.Lines.Add(e.Message);
end;
end;procedure TFrmMain.Button3Click(Sender: TObject);
begin
if ADOConnection1.Connected then
Memo1.Lines.Add('true')
else
Memo1.Lines.Add('false');
end;end.也就是 Coinitialize、CoUninitialize、Button2 和 Button3 的代码我添加的,其他都是例子上抄的。
Form上放一个 TADOConnection ,做好配置,用的是 MyODBC 连接MySQL。情况:
1、直接在 Delphi 里 双击 ADOConnection1 的属性 connected -->它由 false 变成 true,未出错,说明连接是 OK 的。
2、编译好程序,启动 服务,点击 Button2 报错:“[microsoft][odbc驱动程序管理器]中未发现数据源名称并且没有指定默认驱动程序”。点击 Button3 显示是 false。后来 我在 文件Unit2.pas(也就是TFrmMain的文件)最后加上
initialization
Coinitialize(nil);
finalization
CoUninitialize;
但情况一样。查了好多资料,都只说是要加 Coinitialize、CoUninitialize,但我加了没用。请指教下啊 !!!
环境:D7 + XP
代码:
TService:unit Unit1;interfaceuses
Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs,
Unit2, ActiveX;type
TzcServiceDemo = class(TService)
procedure ServiceContinue(Sender: TService; var Continued: Boolean);
procedure ServiceExecute(Sender: TService);
procedure ServicePause(Sender: TService; var Paused: Boolean);
procedure ServiceShutdown(Sender: TService);
procedure ServiceStart(Sender: TService; var Started: Boolean);
procedure ServiceStop(Sender: TService; var Stopped: Boolean);
private
{ Private declarations }
public
function GetServiceController: TServiceController; override;
{ Public declarations }
end;var
zcServiceDemo: TzcServiceDemo;implementation{$R *.DFM}procedure ServiceController(CtrlCode: DWord); stdcall;
begin
zcServiceDemo.Controller(CtrlCode);
end;function TzcServiceDemo.GetServiceController: TServiceController;
begin
Result := ServiceController;
end;procedure TzcServiceDemo.ServiceContinue(Sender: TService;
var Continued: Boolean);
begin
while not Terminated do
begin
Sleep(10);
ServiceThread.ProcessRequests(False);
end;
end;procedure TzcServiceDemo.ServiceExecute(Sender: TService);
begin
while not Terminated do
begin
Sleep(10);
ServiceThread.ProcessRequests(False);
end;
end;procedure TzcServiceDemo.ServicePause(Sender: TService;
var Paused: Boolean);
begin
Paused := True;
end;procedure TzcServiceDemo.ServiceShutdown(Sender: TService);
begin
g_bCanClose := true;
FrmMain.Free;
Status := csStopped;
ReportStatus();
end;procedure TzcServiceDemo.ServiceStart(Sender: TService;
var Started: Boolean);
begin
Coinitialize(nil);
Started := True;
Svcmgr.Application.CreateForm(TFrmMain, FrmMain);
g_bCanClose := False;
FrmMain.Hide;
end;procedure TzcServiceDemo.ServiceStop(Sender: TService;
var Stopped: Boolean);
begin
Stopped := True;
g_bCanClose := True;
FrmMain.Free;
CoUninitialize;
end;end.
TForm:unit Unit2;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls,
ShellApi, DB, ADODB;const
WM_TrayIcon = WM_USER + 1234;type
TFrmMain = class(TForm)
Timer1: TTimer;
Button1: TButton;
ADOConnection1: TADOConnection;
Button2: TButton;
Button3: TButton;
Memo1: TMemo;
procedure FormCreate(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure FormDestroy(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
FIconData: TNotifyIconData;
procedure AddIconToTray;
procedure DelIconFromTray;
procedure TrayIconMessage(var Msg: TMessage); message WM_TrayIcon;
procedure SysButtonMsg(var Msg: TMessage); message WM_SYSCOMMAND;
public
{ Public declarations }
end;var
FrmMain: TFrmMain;
g_bCanClose: Boolean;implementation{$R *.dfm}procedure TFrmMain.AddIconToTray;
begin
ZeroMemory(@FIconData, SizeOf(TNotifyIconData));
FIconData.cbSize := SizeOf(TNotifyIconData);
FIconData.Wnd := Handle;
FIconData.uID := 1;
FIconData.uFlags := NIF_MESSAGE or NIF_ICON or NIF_TIP;
FIconData.uCallbackMessage := WM_TrayIcon;
FIconData.hIcon := Application.Icon.Handle;
FIconData.szTip := 'Delphi服务演示程序';
Shell_NotifyIcon(NIM_ADD, @FIconData);
end;procedure TFrmMain.DelIconFromTray;
begin
Shell_NotifyIcon(NIM_DELETE, @FIconData);
end;procedure TFrmMain.SysButtonMsg(var Msg: TMessage);
begin
if (Msg.wParam = SC_CLOSE) or (Msg.wParam = SC_MINIMIZE) then
Hide
else
inherited; // 执行默认动作
end;procedure TFrmMain.TrayIconMessage(var Msg: TMessage);
begin
if (Msg.LParam = WM_LBUTTONDBLCLK) then Show();
end;procedure TFrmMain.Timer1Timer(Sender: TObject);
begin
AddIconToTray;
end;// *******************************************************************************************procedure TFrmMain.FormCreate(Sender: TObject);
begin
// FormStyle := fsStayOnTop; {窗口最前}
SetWindowLong(Application.Handle, GWL_EXSTYLE, WS_EX_TOOLWINDOW); {不在任务栏显示}
g_bCanClose := False;
Timer1.Interval := 1000;
Timer1.Enabled := True;
AddIconToTray;
end;procedure TFrmMain.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
CanClose := g_bCanClose;
if not CanClose then
begin
Hide;
end;
end;procedure TFrmMain.FormDestroy(Sender: TObject);
begin
Timer1.Enabled := False;
DelIconFromTray;
end;// *******************************************************************************************procedure SendHokKey;stdcall;
var
HDesk_WL: HDESK;
begin
HDesk_WL := OpenDesktop ('Winlogon', 0, False, DESKTOP_JOURNALPLAYBACK);
if (HDesk_WL <> 0) then
if (SetThreadDesktop (HDesk_WL) = True) then
PostMessage(HWND_BROADCAST, WM_HOTKEY, 0, MAKELONG (MOD_ALT or MOD_CONTROL, VK_DELETE));
end;procedure TFrmMain.Button1Click(Sender: TObject);
var
dwThreadID : DWORD;
begin
CreateThread(nil, 0, @SendHokKey, nil, 0, dwThreadID);
end;procedure TFrmMain.Button2Click(Sender: TObject);
begin
try
ADOConnection1.Connected:=true;
except on E:Exception do
Memo1.Lines.Add(e.Message);
end;
end;procedure TFrmMain.Button3Click(Sender: TObject);
begin
if ADOConnection1.Connected then
Memo1.Lines.Add('true')
else
Memo1.Lines.Add('false');
end;end.也就是 Coinitialize、CoUninitialize、Button2 和 Button3 的代码我添加的,其他都是例子上抄的。
Form上放一个 TADOConnection ,做好配置,用的是 MyODBC 连接MySQL。情况:
1、直接在 Delphi 里 双击 ADOConnection1 的属性 connected -->它由 false 变成 true,未出错,说明连接是 OK 的。
2、编译好程序,启动 服务,点击 Button2 报错:“[microsoft][odbc驱动程序管理器]中未发现数据源名称并且没有指定默认驱动程序”。点击 Button3 显示是 false。后来 我在 文件Unit2.pas(也就是TFrmMain的文件)最后加上
initialization
Coinitialize(nil);
finalization
CoUninitialize;
但情况一样。查了好多资料,都只说是要加 Coinitialize、CoUninitialize,但我加了没用。请指教下啊 !!!
环境:D7 + XP
解决方案 »
- 偶然发现不知是Delphi还是windows的Bug?
- 请教一下,rz的groupbar控件的右键菜单?
- 2008 第一贴
- clientdataset换行时如何禁止提交已修改的数据?
- 当COMBOX获得焦点时,自动打开,可以用键盘选择,如何做?
- 学DELPHI的兄弟们注意了,我们公司招人ing!
- DBGridEh+AdoQuery,在DBGridEh中移动到下一条记录,AdoQuery.RecNo却始终为-1,为什么?
- 两个Number型的字段相减后为什么会有哪么多小数位数?怎样使它只有两位小数?
- 6个小问题
- 如何汉化错误提示?
- 急!请问如何在Delphi中实现断点上传?
- delphi 中MaskEdit控件怎么判断为空。。
这个问题与代码关系不是很紧密。
我是按照 网页 : http://bbs.yd153.com/TopicOther.asp?t=5&BoardID=2&id=694 来做的,
并非下载文件。服务启动后 按下 button1 弹出了 任务管理器 ,然后x掉 任务管理器 ,然后 按下 button2 ,Memo中出现 “[microsoft][odbc驱动程序管理器]中未发现数据源名称并且没有指定默认驱动程序”,然后再按下 Button1 ,还是能看到 任务管理器 出现,
说明 Unit2 应该是 活着 啊...
ServiceApplication程序还要装什么吗?
设了 还是不行。
还是我使用上有误??
如下代码:procedure TFrmMain.Button4Click(Sender: TObject);
var ADOCon:TADOConnection;
begin
ADOCon:=TADOConnection.Create(nil);
try
try
ADOCon.Connected:=false;
ADOCon.LoginPrompt:=false;
ADOCon.ConnectionString:='Provider=MSDASQL.1;Password=sasa;Persist Security Info=True;User ID=sa;Data Source=123;Initial Catalog=Test';
ADOCon.Connected:=true;
except on E:Exception do
Memo1.Lines.Add(e.Message);
end;
finally
ADOCon.Free;
end;
end;procedure TFrmMain.Button5Click(Sender: TObject);
var ADOCon:TADOConnection;
begin
ADOCon:=TADOConnection.Create(nil);
try
try
ADOCon.Connected:=false;
ADOCon.LoginPrompt:=false;
ADOCon.ConnectionString:='Provider=SQLNCLI.1;Password=sasa;Persist Security Info=True;User ID=sa;Initial Catalog=Test;Data Source=opos1\sqlexpress';
ADOCon.Connected:=true;
except on E:Exception do
Memo1.Lines.Add(e.Message);
end;
finally
ADOCon.Free;
end;
end;按下Button4(ODBC连sql2005)报错
按下Button5(SQL Native Client 连 2005 ) 不报错
+ ';Password=' + APwd
+ ';User ID=' + AUser
+ ';Extended Properties="DRIVER=' + AMySQLDrv
+ ';SERVER=' + ASvr
+ ';DATABASE=' + ADB
+ ';UID=' + AUser
+ ';PASSWORD=' + APwd
+ ';PORT=3306;SOCKET=;OPTION=3;STMT=;"';
我用的是3.51,没试过报错ConnectionString:= 'DRIVER={MySQL ODBC 5.1 Driver};'+
'SERVER='+ host +';'+
'DATABASE='+ dbname +';'+
'USER=root;'+
'PASSWORD=12345;'+
'OPTION=3;';