Newbee :: Question about windows service
Hi, i'm new on C++ and I'm trying to write a simple windows service
for learning purposes. I created it on MS VC 6 (i'm sorry, this is the
official version of the company I work for) using the wizard. I'm
pasting only the code I've changed indicating them with *****.
The question is: when I run the service from inside the VS IDE, the
file writes normally. But when I go to a DOS window, register the
service and start it (using NET START command or Control Panel
Services applet), the file is not created. I though it was a question
of credentials and I configured the service to start using the
administrator account. But I've got no success. Could someone help.
I'm pretty sure that I'm doing something stupid, but I can't see what.
(if some one give me some advice about thread calling, I'd appreciate
very much)
in StdAfx
static DWORD WINAPI MyThreadWrapper(void *classPtr); //**********
// data members
public:
int iCounter; //**********
ofstream myfile; //**********
DWORD WINAPI MyThread(); //*******
on srv1.cpp
inline void CServiceModule::Start()
{
SERVICE_TABLE_ENTRY st[] =
{
{ m_szServiceName, _ServiceMain },
{ NULL, NULL }
};
if (m_bService && !::StartServiceCtrlDispatcher(st))
{
m_bService = FALSE;
}
if (m_bService == FALSE)
{
this->iCounter = 0; // *********
this->myfile.open("c:\\temp\\example.txt", ios::out |
ios::ate); //
**********
Run();
}
}
inline void CServiceModule::Handler(DWORD dwOpcode)
{
switch (dwOpcode)
{
case SERVICE_CONTROL_STOP:
SetServiceStatus(SERVICE_STOP_PENDING);
PostThreadMessage(dwThreadID, WM_QUIT, 0, 0);
this->myfile.close(); //*********
break;
case SERVICE_CONTROL_PAUSE:
break;
case SERVICE_CONTROL_CONTINUE:
break;
case SERVICE_CONTROL_INTERROGATE:
break;
case SERVICE_CONTROL_SHUTDOWN:
break;
default:
LogEvent(_T("Bad service request"));
}
}
void CServiceModule::Run()
{
// some code here
if (m_bService)
SetServiceStatus(SERVICE_RUNNING);
DWORD dwID; //********
HANDLE hThread; //**********
this->bEndThreads = false; //************
hThread = ::CreateThread(0, 0, MyThreadWrapper, (void*)this,
0,
&dwID); //**********
MSG msg;
// some other code here
}
// these two functions are new
DWORD WINAPI CServiceModule::MyThread()
{
while(!this->bEndThreads)
{
this->iCounter++;
myfile << "Executing thread (";
myfile << this->iCounter;
myfile << " times)\n";
Sleep(1000);
}
return 0;
}
/////////////////////////////////////////////////////////////////////////////
DWORD WINAPI MyThreadWrapper(void *classPtr)
{
CServiceModule *CsrvMod = (CServiceModule *)classPtr;
return CsrvMod->MyThread();
}
Thanks in advance