网上抄的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

解决方案 »

  1.   

    你是下载了文件,还是复制代码?如果复制代码的话,就怀疑是设计期里有些东西没有设置.你可以试试在Unit2里加定时器写入文本文件,看看是不是unit2是否还存活.如果不存活的话,很大可能是就是这个FORM已经关了
      

  2.   

    “未发现数据源名称”,是ODBC数据源没有配置好?
      

  3.   

    安装mySQL的ODBC驱动,然后配置!
    这个问题与代码关系不是很紧密。
      

  4.   


    我是按照 网页 : http://bbs.yd153.com/TopicOther.asp?t=5&BoardID=2&id=694 来做的,
    并非下载文件。服务启动后 按下 button1 弹出了 任务管理器 ,然后x掉 任务管理器 ,然后 按下 button2 ,Memo中出现 “[microsoft][odbc驱动程序管理器]中未发现数据源名称并且没有指定默认驱动程序”,然后再按下 Button1 ,还是能看到 任务管理器 出现,
    说明 Unit2 应该是 活着 啊...
      

  5.   

    但是我在IDE里面连接时OK的啊
      

  6.   

    我装了 mysql-connector-odbc-5.1.5-win32.msi 我做 非ServiceApplication程序 时,一直用的啊没什么问题啊,都OK 啊,
    ServiceApplication程序还要装什么吗?
      

  7.   

    试试把 interactive设成true; adoconnect设成cluserserver;
      

  8.   

    是 cluseserver 吧?
    设了 还是不行。
      

  9.   

    搞了个 sql server 2005 :1、直接用 ADOConnection1 --> SQL Native Client --> 2005 。运行 服务程序 不出错2、ADOConnection1 --> ODBC --> 运行 服务程序 出错...
      

  10.   

    难道是 ODBC 的原因?????求解
      

  11.   

    http://connectionstrings.com/用连接字符试试吧, 要不在属性里设, 在代码里搞, 应该用是的3.5那个驱动.
      

  12.   

    记得 刚刚 好像看到过 关于 Service 程序的权限什么的,也没看明白。是不是 Service程序 看不到 我建的 ODBC??(administrator账号下建的)报的这个错误:“[microsoft][odbc驱动程序管理器]中未发现数据源名称并且没有指定默认驱动程序”,就像是没找到 ODBC的样子...有明白的人说下不?
      

  13.   

    “MySQL+MyODBC 驱动版本不同,有的有BUG。MyODBC-3.51.11-2-win.exe有BUG(用ADO连接时:一条记录中,只要有字段为空,就显示'Invalid field size'),mysql-connector-odbc-5.1.5-win32.msi无此BUG。”这段话是我 去年4月份 记在 TXT里面的,记得当时也是搞得我痛不欲生,你没遇到过吗???
    还是我使用上有误??
      

  14.   


    如下代码: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 ) 不报错
      

  15.   

    如果是用ADO的ConnectionString连接MYSQL,需要在ConnectionString指定MYSQL的驱动,连接字符串范例是:        Result := 'Provider=MSDASQL.1'
              + ';Password=' + APwd
              + ';User ID=' + AUser
              + ';Extended Properties="DRIVER=' + AMySQLDrv
              + ';SERVER=' + ASvr
              + ';DATABASE=' + ADB
              + ';UID=' + AUser
              + ';PASSWORD=' + APwd
              + ';PORT=3306;SOCKET=;OPTION=3;STMT=;"';
      

  16.   


    我用的是3.51,没试过报错ConnectionString:= 'DRIVER={MySQL ODBC 5.1 Driver};'+
                      'SERVER='+ host +';'+
                      'DATABASE='+ dbname +';'+
                      'USER=root;'+
                      'PASSWORD=12345;'+
                      'OPTION=3;';
      

  17.   

    正如 SQLDebug_Fan 和 dinoalex 所说。感谢各位。结贴