这个问题真的有人会吗?

terry_yip 2005-04-13 03:57:23
很多人都知道,如果在98下,把一个VB程序注册成系统服务,可以用"keneral32"下的RegisterServiceProcess来实现,但是,在2000或XP下,该怎么实现呢?我在网上找了几晚都找不到,请问有人做过吗?

...全文
182 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
terry_yip 2005-04-27
  • 打赏
  • 举报
回复
TO pxb0420(三疯幽幽)
是的,你的例子是可以的.这个问题,我找了很久都找不到答案.非常谢谢您.由于前阵时间我一直在外出差,所以今天才回复.
pxb0420 2005-04-15
  • 打赏
  • 举报
回复
我发的例子决对可以的.
pxb0420 2005-04-14
  • 打赏
  • 举报
回复
Sub Main()
Dim hSCManager As Long
Dim hService As Long
Dim ServiceTableEntry As SERVICE_TABLE_ENTRY
Dim b As Boolean
Dim cmd As String

cmd = Trim(LCase(Command()))
Select Case cmd
Case "install" 'Install service on machine
hSCManager = OpenSCManager(vbNullString, vbNullString, _
SC_MANAGER_CREATE_SERVICE)
hService = CreateService(hSCManager, SERVICE_NAME, _
SERVICE_NAME, SERVICE_ALL_ACCESS, _
SERVICE_WIN32_OWN_PROCESS, _
SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL, _
App.Path & "\" & App.EXEName, vbNullString, _
vbNullString, vbNullString, vbNullString, _
vbNullString)
CloseServiceHandle hService
CloseServiceHandle hSCManager
Case "uninstall" 'Remove service from machine
hSCManager = OpenSCManager(vbNullString, vbNullString, _
SC_MANAGER_CREATE_SERVICE)
hService = OpenService(hSCManager, SERVICE_NAME, _
SERVICE_ALL_ACCESS)
DeleteService hService
CloseServiceHandle hService
CloseServiceHandle hSCManager
Case Else 'Start the service
ServiceTableEntry.lpServiceName = SERVICE_NAME
ServiceTableEntry.lpServiceProc = _
FncPtr(AddressOf ServiceMain)
b = StartServiceCtrlDispatcher(ServiceTableEntry)
End Select
End Sub

Sub ServiceMain(ByVal dwArgc As Long, ByVal lpszArgv As Long)
Dim b As Boolean

'Set initial state
ServiceStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS
ServiceStatus.dwCurrentState = SERVICE_START_PENDING
ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP _
Or SERVICE_ACCEPT_PAUSE_CONTINUE _
Or SERVICE_ACCEPT_SHUTDOWN
ServiceStatus.dwWin32ExitCode = 0
ServiceStatus.dwServiceSpecificExitCode = 0
ServiceStatus.dwCheckPoint = 0
ServiceStatus.dwWaitHint = 0

hServiceStatus = RegisterServiceCtrlHandler(SERVICE_NAME, _
AddressOf Handler)
ServiceStatus.dwCurrentState = SERVICE_START_PENDING
b = SetServiceStatus(hServiceStatus, ServiceStatus)

'** Do Initialization Here

ServiceStatus.dwCurrentState = SERVICE_RUNNING
b = SetServiceStatus(hServiceStatus, ServiceStatus)

'** Perform tasks -- if none exit

''** If an error occurs the following should be used for shutting
''** down:
'' SetServerStatus SERVICE_STOP_PENDING
'' Clean up
'' SetServerStatus SERVICE_STOPPED
End Sub

Sub Handler(ByVal fdwControl As Long)
Dim b As Boolean

Select Case fdwControl
Case SERVICE_CONTROL_PAUSE
'** Do whatever it takes to pause here.
ServiceStatus.dwCurrentState = SERVICE_PAUSED
Case SERVICE_CONTROL_CONTINUE
'** Do whatever it takes to continue here.
ServiceStatus.dwCurrentState = SERVICE_RUNNING
Case SERVICE_CONTROL_STOP
ServiceStatus.dwWin32ExitCode = 0
ServiceStatus.dwCurrentState = SERVICE_STOP_PENDING
ServiceStatus.dwCheckPoint = 0
ServiceStatus.dwWaitHint = 0 'Might want a time estimate
b = SetServiceStatus(hServiceStatus, ServiceStatus)
'** Do whatever it takes to stop here.
ServiceStatus.dwCurrentState = SERVICE_STOPPED
Case SERVICE_CONTROL_INTERROGATE
'Fall through to send current status.
Case Else
End Select
'Send current status.
b = SetServiceStatus(hServiceStatus, ServiceStatus)
End Sub

Function FncPtr(ByVal fnp As Long) As Long
FncPtr = fnp
End Function


pxb0420 2005-04-14
  • 打赏
  • 举报
回复
没有不可能的.我还用vb做了一个多元输入法呢?


这个问题在MSDN中有详细说明下边是示例.

在此我也想问下个问题,怎么才能实现像.net编辑器中可以输入中文又能输入日文却能正常显示.eclipse中也可以.如果有人知道希望能给讲解一下.
Add the following code to a .BAS module:


Option Explicit

Private Const SERVICE_WIN32_OWN_PROCESS = &H10&
Private Const SERVICE_WIN32_SHARE_PROCESS = &H20&
Private Const SERVICE_WIN32 = SERVICE_WIN32_OWN_PROCESS + _
SERVICE_WIN32_SHARE_PROCESS

Private Const SERVICE_ACCEPT_STOP = &H1
Private Const SERVICE_ACCEPT_PAUSE_CONTINUE = &H2
Private Const SERVICE_ACCEPT_SHUTDOWN = &H4

Private Const SC_MANAGER_CONNECT = &H1
Private Const SC_MANAGER_CREATE_SERVICE = &H2
Private Const SC_MANAGER_ENUMERATE_SERVICE = &H4
Private Const SC_MANAGER_LOCK = &H8
Private Const SC_MANAGER_QUERY_LOCK_STATUS = &H10
Private Const SC_MANAGER_MODIFY_BOOT_CONFIG = &H20

Public Const STANDARD_RIGHTS_REQUIRED = &HF0000
Private Const SERVICE_QUERY_CONFIG = &H1
Private Const SERVICE_CHANGE_CONFIG = &H2
Private Const SERVICE_QUERY_STATUS = &H4
Private Const SERVICE_ENUMERATE_DEPENDENTS = &H8
Private Const SERVICE_START = &H10
Private Const SERVICE_STOP = &H20
Private Const SERVICE_PAUSE_CONTINUE = &H40
Private Const SERVICE_INTERROGATE = &H80
Private Const SERVICE_USER_DEFINED_CONTROL = &H100
Private Const SERVICE_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED Or _
SERVICE_QUERY_CONFIG Or _
SERVICE_CHANGE_CONFIG Or _
SERVICE_QUERY_STATUS Or _
SERVICE_ENUMERATE_DEPENDENTS Or _
SERVICE_START Or _
SERVICE_STOP Or _
SERVICE_PAUSE_CONTINUE Or _
SERVICE_INTERROGATE Or _
SERVICE_USER_DEFINED_CONTROL)

Private Const SERVICE_DEMAND_START As Long = &H3

Private Const SERVICE_ERROR_NORMAL As Long = &H1

Private Enum SERVICE_CONTROL
SERVICE_CONTROL_STOP = &H1
SERVICE_CONTROL_PAUSE = &H2
SERVICE_CONTROL_CONTINUE = &H3
SERVICE_CONTROL_INTERROGATE = &H4
SERVICE_CONTROL_SHUTDOWN = &H5
End Enum

Private Enum SERVICE_STATE
SERVICE_STOPPED = &H1
SERVICE_START_PENDING = &H2
SERVICE_STOP_PENDING = &H3
SERVICE_RUNNING = &H4
SERVICE_CONTINUE_PENDING = &H5
SERVICE_PAUSE_PENDING = &H6
SERVICE_PAUSED = &H7
End Enum

Private Type SERVICE_TABLE_ENTRY
lpServiceName As String
lpServiceProc As Long
lpServiceNameNull As Long
lpServiceProcNull As Long
End Type

Private Type SERVICE_STATUS
dwServiceType As Long
dwCurrentState As Long
dwControlsAccepted As Long
dwWin32ExitCode As Long
dwServiceSpecificExitCode As Long
dwCheckPoint As Long
dwWaitHint As Long
End Type

Private Declare Function StartServiceCtrlDispatcher _
Lib "advapi32.dll" Alias "StartServiceCtrlDispatcherA" _
(lpServiceStartTable As SERVICE_TABLE_ENTRY) As Long
Private Declare Function RegisterServiceCtrlHandler _
Lib "advapi32.dll" Alias "RegisterServiceCtrlHandlerA" _
(ByVal lpServiceName As String, ByVal lpHandlerProc As Long) _
As Long
Private Declare Function SetServiceStatus _
Lib "advapi32.dll" (ByVal hServiceStatus As Long, _
lpServiceStatus As SERVICE_STATUS) As Long
Private Declare Function OpenSCManager _
Lib "advapi32.dll" Alias "OpenSCManagerA" _
(ByVal lpMachineName As String, ByVal lpDatabaseName As String, _
ByVal dwDesiredAccess As Long) As Long
Private Declare Function CreateService _
Lib "advapi32.dll" Alias "CreateServiceA" _
(ByVal hSCManager As Long, ByVal lpServiceName As String, _
ByVal lpDisplayName As String, ByVal dwDesiredAccess As Long, _
ByVal dwServiceType As Long, ByVal dwStartType As Long, _
ByVal dwErrorControl As Long, ByVal lpBinaryPathName As String, _
ByVal lpLoadOrderGroup As String, ByVal lpdwTagId As String, _
ByVal lpDependencies As String, ByVal lp As String, _
ByVal lpPassword As String) As Long
Private Declare Function DeleteService _
Lib "advapi32.dll" (ByVal hService As Long) As Long
Declare Function CloseServiceHandle _
Lib "advapi32.dll" (ByVal hSCObject As Long) As Long
Declare Function OpenService _
Lib "advapi32.dll" Alias "OpenServiceA" _
(ByVal hSCManager As Long, ByVal lpServiceName As String, _
ByVal dwDesiredAccess As Long) As Long

'** Change SERVICE_NAME as needed
Private Const SERVICE_NAME As String = "MyService"

Private hServiceStatus As Long
Private ServiceStatus As SERVICE_STATUS

MmMVP 2005-04-14
  • 打赏
  • 举报
回复
terry_yip(哈哈) :
具体实现办法请参考:
http://www.pconline.com.cn/pcedu/empolder/gj/vb/0404/354501.html
IamDeane 2005-04-13
  • 打赏
  • 举报
回复
还是C/C++开发这种玩意快些吧
tmran 2005-04-13
  • 打赏
  • 举报
回复
Private Sub Form_Load()
App.TaskVisible = False
End Sub

MSDN的解释:

TaskVisible 属性


返回或设置一个值,用来确定应用程序是否出现在窗口任务列表中。

语法

object.TaskVisible [= boolean]

TaskVisible 属性的语法包含下面部分:

部分 描述
object 对象表达式,其值是“应用于”列表中的一个对象。
boolean 布尔表达式用来确定应用程序是否出现在任务列表中,对布尔的描述如设置值中所示。


设置值

boolean 的设置值如下:

设置 描述
True (缺省)应用程序出现在窗口任务列表中。
False 应用程序不出现在窗口任务列表中。


说明

如果应用程序不显示接口,那么它的 TaskVisible 属性只能设置为 False,例如不包含或不显示 Form 对象的 ActiveX 部件。如果应用程序显示接口,那么 TaskVisible 属性被自动设置为 True。

terry_yip 2005-04-13
  • 打赏
  • 举报
回复
TO: MmMVP(做人要厚道)

你说把过程写在DLL里,然后用rundll32来调用,这种方法在网上很多人都这样讲.这个办法我试过了,我写了一个1.dll,里面有个public sub aa ,但当我在另一个工程中,以Shell "rundll32.exe d:\1.dll,aa"来调用1.dll中的这个过程时,却显示"1.dll出错,丢失条目".

我猜想,原因有以下几种:

1 用VB来写的DLL文件,和真正意义上的DLL文件是不同的.那种真正意义上的DLL文件,是需要用VC或delphi来写的,即是在VB中用declare来声明的那种.

2 Shell "rundll32.exe d:\1.dll,aa"这句的语法不对,我以前试过,如果在ASP中调用这种VB写的DLL文件里面的过程,是需要指明工程的名称还有类名称的,而不是光写个aa就行了.
jlum99 2005-04-13
  • 打赏
  • 举报
回复
2000下远线程注入,VB还是做的到的。
trite 2005-04-13
  • 打赏
  • 举报
回复
I_Love_VB2003 2005-04-13
  • 打赏
  • 举报
回复
帮顶。
MmMVP 2005-04-13
  • 打赏
  • 举报
回复
其实这种隐藏进程的方法,VB6编程一般只能对WIN98系统有效,而对win2000是没有效果的,要在win2000里用VB编写也能够隐藏进程的程序,据有些专业人士讲“几乎是不可能的事”,除非用C语言或Delphi等“底层”功能更强的编程软件才能实现,但也不排除玩VB到炉火纯青的高手,也可能用VB编出此类能在WIN2000中真正隐藏进程的程序来的。我还看过许多用VB编的木马和病毒,但要真正逃过WIN2000自带的进程列表,还是很少见到,希望那位高手能解决这一问题。

解决方案:
写一个dll然后用rundll32运行,就可以达到要求。 在进程列表里面显示的 是rundll32,不是你的应用程序的名字。
terry_yip 2005-04-13
  • 打赏
  • 举报
回复
TOjlum99:

2000下远线程注入是什么意思呢?能给出个例子参考吗?十分感谢

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧