我写了一个服务,但是在里面调用动态库,发现调用不了
我是在服务里面加了一个窗口,然后都是在窗口里面写的。
不是很清楚服务调用动态库怎么调用,需要指明路径?还是把动态库拷贝到什么地方去?
希望各路大侠指点。下面是源码        CSSend := TClientSocket.Create(nil);try
        if not CSSend.Active then
        begin
                CSSend.Address :='127.0.0.1' ;{远程IP地址}
                CSSend.Port :=5000;{SOCKET端口}
                CSSend.Open ; {建立连接}
                try
                          SendStr := '00a86000000000000000000000032020';
                          len := length(SendStr);
                          StrCopy(data, Pchar(SendStr));
                          len := len div 2;
                          ret :=asc_hex(data,hexdata,len);//这就是那个动态库里面的函数,但是成功执行。
                          ret := CSSend.Socket.SendBuf(hexdata,len);
                          len :=  CSSend.Socket.ReceiveLength;
                          ret := CSSend.Socket.ReceiveBuf(data,len);
                          hex_asc(data,hexdata,len);
                          MemInfo.Lines.Add(hexdata);
                finally
                        CSSend.Close;
                end;
        end;
finally
        CSSend.Free;
end;下面是服务的程序
procedure ServiceController(CtrlCode: DWord); stdcall;
begin
  DelphiService.Controller(CtrlCode);
end;function TDelphiService.GetServiceController: TServiceController;
begin
  Result := ServiceController;
end;procedure TDelphiService.ServiceContinue(Sender: TService;
  var Continued: Boolean);
begin
        while not Terminated do
        begin
                Sleep(10);
                ServiceThread.ProcessRequests(False);
        end;
end;procedure TDelphiService.ServiceExecute(Sender: TService);
begin
        while not Terminated do
        begin
                Sleep(10);
                ServiceThread.ProcessRequests(False);
        end;end;procedure TDelphiService.ServicePause(Sender: TService;
  var Paused: Boolean);
begin
        Paused := True;
end;procedure TDelphiService.ServiceShutdown(Sender: TService);
begin
        gbCanClose := true;
        FrmMain.Free;
        Status := csStopped;
        ReportStatus();
end;procedure TDelphiService.ServiceStart(Sender: TService;
  var Started: Boolean);
begin
        Started := True;
        Svcmgr.Application.CreateForm(TFrmMain, FrmMain);
        gbCanClose := False;
        FrmMain.Hide;
end;procedure TDelphiService.ServiceStop(Sender: TService;
  var Stopped: Boolean);
begin
        Stopped := True;
        gbCanClose := True;
        FrmMain.Free;end;

解决方案 »

  1.   

    下面是窗口程序代码:procedure TFrmMain.FormCreate(Sender: TObject);
    begin
            FormStyle := fsStayOnTop;
            SetWindowLong(Application.Handle, GWL_EXSTYLE, WS_EX_TOOLWINDOW);
            gbCanClose := False;
            Timer1.Interval := 1000;
            Timer1.Enabled := True;
    end;procedure TFrmMain.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    begin
            CanClose := gbCanClose;
            if not CanClose then
            begin
                    Hide;
            end;end;procedure TFrmMain.FormDestroy(Sender: TObject);
    begin
            Timer1.Enabled := False;
            DelIconFromTray;end;procedure TFrmMain.AddIconToTray;
    begin
            ZeroMemory(@IconData, SizeOf(TNotifyIconData));
            IconData.cbSize := SizeOf(TNotifyIconData);
            IconData.Wnd := Handle;
            IconData.uID := 1;
            IconData.uFlags := NIF_MESSAGE or NIF_ICON or NIF_TIP;
            IconData.uCallbackMessage := WM_TrayIcon;
            IconData.hIcon := Application.Icon.Handle;
            IconData.szTip := 'Delphi服务演示程序';
            Shell_NotifyIcon(NIM_ADD, @IconData);
    end;procedure TFrmMain.DelIconFromTray;
    begin
            Shell_NotifyIcon(NIM_DELETE, @IconData);
    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;
      

  2.   

    回2楼,已经选上了,我做了一个按钮,显示ctrl+del+alt已经看到效果了
      

  3.   

    下面是动态库里面2个函数的声明function asc_hex(asc:pchar;hex:pchar;len:longint):smallint;stdcall;
                    far;external 'Tool.dll'name 'asc_hex';function hex_asc(hex:pchar;asc:pchar;len:longint):smallint;stdcall;
                    far;external 'Tool.dll'name 'hex_asc';