#include <windows.h>
#include <stdio.h>
#include <pbext.h>
SERVICE_STATUS ServiceStatus;
SERVICE_STATUS_HANDLE hStatus;
SERVICE_TABLE_ENTRY ServiceTable[2];
IPB_Session* gsession;
pbobject gpbobj;
LPSTR gclsname;
bool gisset=false;
void ServiceMain(int argc, char** argv);
void ControlHandler(DWORD request);
void opensvr(LPSTR ServiceName);
PBXEXPORT LPCTSTR PBXCALL PBX_GetDescription()
{
static const TCHAR desc[] = {
"class n_pbx_service from nonvisualobject\n"
"function boolean OpenSvr(string servicename,string clsname)\n"
"end class\n"
};
return desc;
}
class CNonVisualExt : public IPBX_NonVisualObject
{
IPB_Session* d_session;
pbobject d_pbobj;
public:
CNonVisualExt(IPB_Session* session, pbobject pbobj)
:
d_session(session),
d_pbobj(pbobj)
{
}
~CNonVisualExt()
{
}
PBXRESULT Invoke
(
IPB_Session *session,
pbobject obj,
pbmethodID mid,
PBCallInfo *ci
);
void Destroy()
{
delete this;
}
};
PBXRESULT CNonVisualExt::Invoke
(
IPB_Session *session,
pbobject obj,
pbmethodID mid,
PBCallInfo *ci
)
{
switch(mid)
{
case 0:
LPSTR ServiceName;
if(gisset)
{
ci->returnValue->SetBool(0);
return PBX_OK;
}
gsession =session;
gclsname =new char[session->GetStringLength(ci->pArgs->GetAt(1)->GetString()) + 1];
strcpy(gclsname,session->GetString(ci->pArgs->GetAt(1)->GetString()));
ServiceName =new char[session->GetStringLength(ci->pArgs->GetAt(0)->GetString()) + 1];
strcpy(ServiceName,session->GetString(ci->pArgs->GetAt(0)->GetString()));
gisset =true;
ci->returnValue->SetBool(1);
opensvr(ServiceName);
break;
}
return PBX_OK;
}
PBXEXPORT PBXRESULT PBXCALL PBX_CreateNonVisualObject
(
IPB_Session* pbsession,
pbobject pbobj,
LPCTSTR className,
IPBX_NonVisualObject **obj
)
{
PBXRESULT result = PBX_OK;
if (strcmp(className,"n_pbx_service") == 0)
{
*obj = new CNonVisualExt(pbsession, pbobj);
}
else
{
*obj = NULL;
result = PBX_FAIL;
}
return PBX_OK;
};
void opensvr(LPSTR ServiceName)
{
ServiceTable[0].lpServiceName = ServiceName;
ServiceTable[0].lpServiceProc = (LPSERVICE_MAIN_FUNCTION)ServiceMain;
ServiceTable[1].lpServiceName = NULL;
ServiceTable[1].lpServiceProc = NULL;
StartServiceCtrlDispatcher(ServiceTable);
return;
}
void ServiceMain(int argc, char** argv)
{
ServiceStatus.dwServiceType = SERVICE_WIN32;
ServiceStatus.dwCurrentState = SERVICE_START_PENDING;
ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN;
ServiceStatus.dwWin32ExitCode = 0;
ServiceStatus.dwServiceSpecificExitCode = 0;
ServiceStatus.dwCheckPoint = 0;
ServiceStatus.dwWaitHint = 0;
hStatus = RegisterServiceCtrlHandler(
ServiceTable[0].lpServiceName,
(LPHANDLER_FUNCTION)ControlHandler);
if (hStatus == (SERVICE_STATUS_HANDLE)0)
{
return;
}
ServiceStatus.dwCurrentState = SERVICE_RUNNING;
SetServiceStatus (hStatus, &ServiceStatus);
DWORD SLEEP_TIME=0;
pbboolean isnull=1;
// HDESK hdeskCurrent;
// HDESK hdesk;
// HWINSTA hwinstaCurrent;
// HWINSTA hwinsta;
//
// hwinstaCurrent = GetProcessWindowStation();
// if (hwinstaCurrent == NULL){
//
// return;
// }
//
// hdeskCurrent = GetThreadDesktop(GetCurrentThreadId());
// if (hdeskCurrent == NULL){
//
// return;
// }
//
////打开winsta0
// hwinsta = OpenWindowStation("winsta0", FALSE,
// WINSTA_ACCESSCLIPBOARD |
// WINSTA_ACCESSGLOBALATOMS |
// WINSTA_CREATEDESKTOP |
// WINSTA_ENUMDESKTOPS |
// WINSTA_ENUMERATE |
// WINSTA_EXITWINDOWS |
// WINSTA_READATTRIBUTES |
// WINSTA_READSCREEN |
// WINSTA_WRITEATTRIBUTES);
// if (hwinsta == NULL){
//
//
// return;
// }
//
// if (!SetProcessWindowStation(hwinsta)){
//
//
// return;
// }
//
////打开desktop
// hdesk = OpenDesktop("default", 0, FALSE,
// DESKTOP_CREATEMENU |
// DESKTOP_CREATEWINDOW |
// DESKTOP_ENUMERATE |
// DESKTOP_HOOKCONTROL |
// DESKTOP_JOURNALPLAYBACK |
// DESKTOP_JOURNALRECORD |
// DESKTOP_READOBJECTS |
// DESKTOP_SWITCHDESKTOP |
// DESKTOP_WRITEOBJECTS);
// if (hdesk == NULL){
//
//
// return;
// }
//
// SetThreadDesktop(hdesk);
/* SC_HANDLE Service,scm;
SERVICE_STATUS status;
scm = OpenSCManager(NULL,NULL,SC_MANAGER_ENUMERATE_SERVICE);
Service = OpenService(scm,"MSSQLServer",SERVICE_ALL_ACCESS|READ_CONTROL);
QueryServiceStatus(Service,&status);
if(status.dwCurrentState!=SERVICE_RUNNING)
{
StartService(Service,0,NULL);
}
do
{
QueryServiceStatus(Service,&status);
Sleep(500);
}while(status.dwCurrentState!=SERVICE_RUNNING);
CloseServiceHandle(Service);
CloseServiceHandle(scm);*/
pbgroup group =gsession->FindGroup(gclsname, pbgroup_userobject);
pbclass cls =gsession->FindClass(group,gclsname);
gpbobj =gsession->NewObject(cls);
//MSG msg;
//while(ServiceStatus.dwCurrentState == SERVICE_RUNNING)// && GetMessage(&msg, NULL, 0, 0))
// {
// TranslateMessage(&msg);
// DispatchMessage(&msg);
// gsession->ProcessPBMessage();
// }
//gsession->PopLocalFrame();
//ServiceStatus.dwCurrentState = SERVICE_STOPPED;
//ServiceStatus.dwWin32ExitCode = -1;
//SetServiceStatus(hStatus, &ServiceStatus);
//::Sleep(100);
//return;
pbfieldID fid =gsession->GetFieldID(cls,"t");
SLEEP_TIME =gsession->GetLongField(gpbobj,fid,isnull);
pbmethodID mid =gsession->GetMethodID(cls,"ServiceFunction",PBRT_FUNCTION,"",false);
PBCallInfo ci;
/* if (status.dwCurrentState!=SERVICE_STOPPED)
{
success = ControlService(Service,SERVICE_CONTROL_STOP,&status);
if (!success){
cout<<"ControlService ERROR:"<<GetLastError()<<endl;
CloseServiceHandle(Service);
CloseServiceHandle(scm);
return false;
}
}
success = DeleteService(Service);
if (!success){
cout<<"DeleteService ERROR:"<<GetLastError()<<endl;
CloseServiceHandle(Service);
CloseServiceHandle(scm);
return false;
}*/
while (ServiceStatus.dwCurrentState == SERVICE_RUNNING)
{
int result=0;
gsession->InitCallInfo(cls,mid,&ci);
gsession->InvokeObjectFunction(gpbobj,mid,&ci);
result=ci.returnValue->GetLong();
if (result)
{
ServiceStatus.dwCurrentState = SERVICE_STOPPED;
ServiceStatus.dwWin32ExitCode = 0;
SetServiceStatus(hStatus, &ServiceStatus);
Sleep(10000);
return;
}
Sleep(SLEEP_TIME);
}
Sleep(10000);
return;
// __except(EXCEPTION_EXECUTE_HANDLER)
//gsession->PopLocalFrame();
}
void ControlHandler(DWORD request)
{
switch(request)
{
case SERVICE_CONTROL_STOP:
ServiceStatus.dwWin32ExitCode = 0;
ServiceStatus.dwCurrentState = SERVICE_STOPPED;
SetServiceStatus (hStatus, &ServiceStatus);
return;
case SERVICE_CONTRO