我写了一个服务,但是在里面调用动态库,发现调用不了
我是在服务里面加了一个窗口,然后都是在窗口里面写的。
不是很清楚服务调用动态库怎么调用,需要指明路径?还是把动态库拷贝到什么地方去?
希望各路大侠指点。下面是源码 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;
我是在服务里面加了一个窗口,然后都是在窗口里面写的。
不是很清楚服务调用动态库怎么调用,需要指明路径?还是把动态库拷贝到什么地方去?
希望各路大侠指点。下面是源码 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;
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;
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';