读书人

PB调用api函数CreateService创造系统服

发布时间: 2012-12-31 11:57:52 作者: rapoo

PB调用api函数CreateService创建系统服务
of_createservice函数(string lpservicename,string lpdisplayname,unsignedlong dwdesiredaccess,unsignedlong dwservicetype,unsignedlong dwstarttype,unsignedlong dwerrorcontrol,string lpbinarypathname,string lploadordergroup,unsignedlong lpdwtagid,string lpdependencies,string lp,string lppassword)


uLong hSCManager, hService, r, r1, ll_rtn, ll , hCSrvState
string s, ls_null

QUERY_SERVICE_CONFIG scfg
setnull(ls_null)
hSCManager = OpenSCManager(ls_null, ls_null, SC_MANAGER_ALL_ACCESS)
If hSCManager > 0 Then
hCSrvState = CreateService(hSCManager,ref lpServiceName, ref lpDisplayName, dwDesiredAccess, dwServiceType, dwStartType, dwErrorControl,ref lpBinaryPathName, ref lpLoadOrderGroup, ref lpdwTagId, ref lpDependencies, ref lp, ref lpPassword)
if isnull(hCSrvState) then
return false
else
return true
end if
End If

return false


Local External Functions

FUNCTION ulong OpenSCManager(ref string lpMachineName,ref string lpDatabaseName,ulong dwDesiredAccess) LIBRARY "advapi32.dll" ALIAS FOR "OpenSCManagerA"

FUNCTION ulong CreateService(ulong hSCManager,ref string lpServiceName,ref string lpDisplayName,ulong dwDesiredAccess,ulong dwServiceType,ulong dwStartType,ulong dwErrorControl,ref string lpBinaryPathName,ref string lpLoadOrderGroup,ref ulong lpdwTagId,ref string lpDependencies,ref string lp,ref string lpPassword) LIBRARY "advapi32.dll" ALIAS FOR "CreateServiceA"


Instance Variables

private:
constant ulong SC_MANAGER_ALL_ACCESS = 0








创建服务事件

nvo_systemserver lnvo
boolean csrvstate

constant ulong SERVICE_ALL_ACCESS = 983551
constant ulong SERVICE_WIN32_OWN_PROCESS = 16

string lpServiceName //创建登记数据库中的关键字
string lpDisplayName //服务名称
ulong dwDesiredAccess //指定服务返回类型
ulong dwServiceType //指定服务类型
ulong dwStartType //指定启动类型 2表示自动运行 3表示手动运行 4表示禁止
ulong dwErrorControl //指定服务启动失败的严重程度
string lpBinaryPathName //指定服务程序二进制文件的路径
string lpLoadOrderGroup //指定顺序装入的服务组名
ulong lpdwTagId //忽略,NULL
string lpDependencies //指定服务帐号。如是NULL,则表示使用LocalSystem帐号
string lp
string lpPassword //指定对应的口令。为NULL表示无口令。但使用LocalSystem时填NULL
string ls_null

lpServiceName = "MyService"
lpDisplayName = "测试服务"
dwServiceType = 272
dwStartType = 2
dwErrorControl = 1
lpBinaryPathName = ''
lpLoadOrderGroup = '0'
setnull(ls_null)

csrvstate = lnvo.of_createservice(ref lpServiceName,ref lpDisplayName,SERVICE_ALL_ACCESS,SERVICE_WIN32_OWN_PROCESS,dwStartType,dwErrorControl,ref lpBinaryPathName,ref lpLoadOrderGroup,ref lpdwTagId,ref lpDependencies,ref lp,ref lpPassword)
if(csrvstate) then
messagebox("提示","成功创建" + lpServiceName + "服务!")
else
messagebox("提示","创建服务失败!")
end if



执行后没有返回错误,但是服务还是没有创建成功,哪里出了问题?




[解决办法]

引用:
引用:
这样试没用的,要创建成功很容易,但PB没办法直接支持回调函数,所以没办法直接返回结果给服务管理器,即使加进去了,启动,停止,之类的消息PB都无法接收到;
目前用PB的话只有通过PBNI去写个实现了回调函数功能的基类给pb来继承,原来有写过是可行的,当时参考的国外的例子,你搜搜看~~

那意思说白了就是pb压根就办不到是不?我是个新手,pbni不太了解,貌似这东西……


可以这样理解,只用PB是达不到的,仅因为它不支持回调函数(即在PB中无法表示函数地址),这样就无法响应服务程序的回馈

PBNI的话是实现一些PB自身无法直接处理的问题,我们之前是用C来写一个基类,实现服务的基本框框,再生成pbx文件,再通过pbx2pbd.exe生成pb可以引用的pbd文件,再继承pbd中的对象,这样在对象中补充相应函数的实现就可以了

[解决办法]
string lpBinaryPathName //指定服务程序二进制文件的路径
string lpLoadOrderGroup //指定顺序装入的服务组名

参数都没有设置。。。服务上哪里去安装啊。。。
[解决办法]
把程序单步执行一下,如果用到回调函数,PB需要用pbni来实现,如果用pb11以上版本,可以用在程序中直接嵌套.net代码来实现
[解决办法]
PB.NET WinForm 应该可以直接使用 回调函数。。。

读书人网 >PB

热点推荐