有一段代码:HINSTANCE hInst = LoadLibrary("KERNEL32.DLL");
if(hInst)
{
typedef DWORD (WINAPI *MYFUNC)(DWORD,DWORD);
MYFUNC RegisterServiceProcessFun = NULL;
RegisterServiceProcessFun =(MYFUNC)GetProcAddress(hInst, "RegisterServiceProcess");
if(RegisterServiceProcessFun)
//1 registers the process as a service process
RegisterServiceProcessFun(GetCurrentProcessId(),1);
FreeLibrary(hInst);
} 看起来好像是先找到一个函数的地址,然后通过函数指针调用,注册服务,
但RegisterServiceProcessFun =(MYFUNC)GetProcAddress(hInst, "RegisterServiceProcess");这句根本就没有执行成功这段代码是2000下的吗?
if(hInst)
{
typedef DWORD (WINAPI *MYFUNC)(DWORD,DWORD);
MYFUNC RegisterServiceProcessFun = NULL;
RegisterServiceProcessFun =(MYFUNC)GetProcAddress(hInst, "RegisterServiceProcess");
if(RegisterServiceProcessFun)
//1 registers the process as a service process
RegisterServiceProcessFun(GetCurrentProcessId(),1);
FreeLibrary(hInst);
} 看起来好像是先找到一个函数的地址,然后通过函数指针调用,注册服务,
但RegisterServiceProcessFun =(MYFUNC)GetProcAddress(hInst, "RegisterServiceProcess");这句根本就没有执行成功这段代码是2000下的吗?
解决方案 »
- InstallShield 2009修改INI文件问题
- 无法解析的外部符号错误,实在找不出原因,求助
- 程序太老 没办法设断点怎么办? 怎么去调试跟踪呢?
- 在VMware上测试WINSOCK问题,高手帮个忙
- 如何让别人用看图软件看不到我的图片,但可以用程序来读取它,各位帮忙
- 菜鸟求助(在线等):为什么使用InvalidateRec指定的刷新区域不起作用?
- VC 使用 ADO 如何建立 ACCESS2000数据库 ?
- 我在access中建了一个查询表,我在程序中用Open语句打不开它啊!!!!
- 朋友们请谈谈端口,接口,套接口
- 急急急!!!!到哪里能下栽到ms的Visual InterDev!
- 怎样对内存DC的内容进行读写等操作?
- 高分找监听IP数据包的程序源码
ModifyStyleEx(WS_EX_APPWINDOW, WS_EX_TOOLWINDOW); 怎么做成后台服务?还有什么办法吗
void CmdRegisterService()
{
SCHANDLE schService;
SCHANDLE schSCManager;
TCHAR szPath[512];
//获得后台服务进程执行路径
if(GetModuleFileName(NULL,szPath,512)==0)
{tprintf(TEXT(“Unable to install %s - %s\n"),
TEXT(“Service Example"), GetLastErrorText(szErr, 256));
return;
}
//打开服务控制管理器数据库
schSCManager=OpenSCManager(
NULL, //本地机器
NULL, //默认数据库
SCMANAGERALLACCESS //访问权限
);
//在此数据库中创建后台服务线程对象
if(schSCManager)
{ schService=CreateService(
schSCManager, //服务控制管理器数据库
TEXT(“ServiceExample"), //后台服务名称
TEXT(“Service Example"),//在服务控制面板中显示的//服务名称
SERVICE_ALL_ACCESS, //访问权限
SERVICE_WIN32_OWN_PROCESS, //服务类型
SERVICE_AUTO_START, //启动类型,随系统自动//加载
SERVICE_ERROR_NORMAL,
szPath,
NULL,
NULL,
TEXT(“"),
NULL, //本地系统帐号
NULL);// 没有口令
//在这里可以创建多个后台服务线程对象,完成不同的
//后台任务
if(schService)
{tprintf(TEXT(“%s installed.\n"),TEXT(“Service Example"));
CloseServiceHandle(schService);
}
else
{tprintf(TEXT(“CreateService failed-%s\n"),
GetLastErrorText(szErr, 256));
}
CloseServiceHandle(schSCManager);
}
else
tprintf(TEXT(“OpenSCManager failed - %s\n"),
GetLastErrorText(szErr,256));
}
//定义后台服务线程入口表
SERVICETABLEENTRY MyServiceTable[]=
{
{
TEXT(“ServiceExample"),//后台服务线程的名称
(LPSERVICEMAINFUNCTION)MyServiceMain//后台服//务线程入口点
},
{NULL, NULL } //标志表的结束
};
//服务线程入口函数
void WINAPI MyServiceMain(DWORD dwArgc, LPTSTR *lpszArgv)
{
//注册服务控制处理函数
sshStatusHandle=RegisterServiceCtrlHandler(TEXT(“ServiceExample"), Servi ceControlHandler);
if(!sshStatusHandle)
goto cleanup;
//服务类型
ssStatus.dwServiceType=SERVICE_WIN32_OWN_PROCESS;
//指定的出错代码
ssStatus.dwServiceSpecificExitCode=0;
//启动自己定义的后台服务
ServiceStart();
cleanup:
if(sshStatusHandle)
(VOID)ReportStatusToSCMgr(
SERVICESTOPPED,dwErr,0);
return;
}//服务控制处理函数:负责接收和处理服务控制管理器发出的
//命令
VOID WINAPI ServiceControlHandler(DWORD dwCtrlCode)
{
switch(dwCtrlCode)
{
//停止服务之前,应首先向服务控制管理器回送状态信息
case SERVICE_CONTROLSTOP:
ReportStatusToSCMgr(SERVICE_STOP_PENDING,NOE RROR, 0);
ServiceStop();
return;
//更新服务状态
case SERVICE_CONTROL_INTERROGATE:
break;
default:
break;
}
//向服务控制面板管理器回送状态信息
ReportStatusToSCMgr(ssStatus.dwCurrentState, NOERROR, 0);
}//设置当前服务状态并将状态信息回送到服务控制管理器
BOOL ReportStatusToSCMgr(DWORD dwCurrentState,DWORD
dwWin32ExitCode,WORD dwWaitHint)
{
static DWORD dwCheckPoint=1;
BOOL fResult=TRUE;
if(dwCurrentState==SERVICESTARTPENDING)
ssStatus.dwControlsAccepted=0;
else
ssStatus.dwControlsAccepted=SERVICE_ACCEPT_STOP;
//设置状态信息
ssStatus.dwCurrentState=dwCurrentState;
ssStatus.dwWin32ExitCode=dwWin32ExitCode;
ssStatus.dwWaitHint=dwWaitHint;
if((dwCurrentState==SERVICE_RUNNING )‖
(dwCurrentState==SERVICE_STOPPED))
ssStatus.dwCheckPoint=0;
else
ssStatus.dwCheckPoint=dwCheckPoint++;
//将状态信息回送到服务控制管理器
if(!(fResult=SetServiceStatus(sshStatusHandle,&ssStatus))){
AddToMessageLog(TEXT(“SetServiceStatus"));//向NT事//件管理器报告出错消息
}
return fResult;
}//服务进程入口
voidCRTAPI1 main(int argc, char **argv)
{
if((argc>1)&&((*argv[1]==‘-')‖(*argv[1]==‘/')) )
{
if(stricmp(“register", argv[1]+1)==0)
CmdRegisterService(); //注册后台服务线程对象
else
goto dispatch;
exit(0);
}
dispatch:
//启动服务控制分配器,建立主线程与服务控制面板的
//连接
if(StartServiceCtrlDispatcher(MyServiceTable))
AddToMessageLog(TEXT (“StartServiceCtrlDispatcher success."));
}void ServiceStart()
{
//向服务控制管理器报告服务正在启动
if(!ReportStatusToSCMgr(
SERVICE_START_PENDING, //service state
NOERROR,
dwWaitHint))
return;
//下面是线程的初始化代码(注意:初始化代码执行时间
//不应超过设定的nWaitHi nt,否则服务控制管理器会认
//为服务线程已经没有响应
//向服务控制管理器报告服务已经启动
if(!ReportStatusToSCMgr(
SERVICE_RUNNING, //service state
NOERROR, //exit code
0)) //wait hint
return;
//开始执行服务
}
//停止后台服务线程
void ServiceStop()
{
//添加结束服务线程代码
}
BTW,好像开发驱动程序可以实现真正的隐藏,不过,我没试过.