我是用ATL创建的一个EXE服务的方式而且是第三个既服务方式的~~~运行的代码如下: void CServiceModule::Run() { _Module.dwThreadID = GetCurrentThreadId(); HRESULT hr = CoInitialize(NULL); // If you are running on NT 4.0 or higher you can use the following call // instead to make the EXE free threaded. // This means that calls come in on a random RPC thread // HRESULT hr = CoInitializeEx(NULL, COINIT_MULTITHREADED); _ASSERTE(SUCCEEDED(hr)); // This provides a NULL DACL which will allow access to everyone. CSecurityDescriptor sd; sd.InitializeFromThreadToken(); hr = CoInitializeSecurity(sd, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL); _ASSERTE(SUCCEEDED(hr)); hr = _Module.RegisterClassObjects(CLSCTX_LOCAL_SERVER | CLSCTX_REMOTE_SERVER, REGCLS_MULTIPLEUSE); _ASSERTE(SUCCEEDED(hr)); LogEvent(_T("Service started")); if (m_bService) SetServiceStatus(SERVICE_RUNNING); InitCard();
MSG msg; while (GetMessage(&msg, 0, 0, 0)) DispatchMessage(&msg);
void CServiceModule::Run()
{
_Module.dwThreadID = GetCurrentThreadId(); HRESULT hr = CoInitialize(NULL);
// If you are running on NT 4.0 or higher you can use the following call
// instead to make the EXE free threaded.
// This means that calls come in on a random RPC thread
// HRESULT hr = CoInitializeEx(NULL, COINIT_MULTITHREADED); _ASSERTE(SUCCEEDED(hr)); // This provides a NULL DACL which will allow access to everyone.
CSecurityDescriptor sd;
sd.InitializeFromThreadToken();
hr = CoInitializeSecurity(sd, -1, NULL, NULL,
RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL);
_ASSERTE(SUCCEEDED(hr)); hr = _Module.RegisterClassObjects(CLSCTX_LOCAL_SERVER | CLSCTX_REMOTE_SERVER, REGCLS_MULTIPLEUSE);
_ASSERTE(SUCCEEDED(hr)); LogEvent(_T("Service started"));
if (m_bService)
SetServiceStatus(SERVICE_RUNNING); InitCard();
MSG msg;
while (GetMessage(&msg, 0, 0, 0))
DispatchMessage(&msg);
ExitCard(); //我就是想把我这个自己写的函数加到这里面,可进程在杀死后就直接退出了;因为进程的消息队列也没有了,所以没有走我下面的ExitCard()函数,我的资源也没有释放掉;
_Module.RevokeClassObjects();
CoUninitialize();
我在你那个InitCard地方调用我的函数(通过创建线程),我想在函数里边做些初始化工作,如果初始化成功,则继续向下运行,否则,提示一些信息并在那个地方return了。可是不行,服务还是启动了。我在创建线程后,WaitForSingleObject了,也是不行,WAIT_TIMEOUT,WAIT_OBJECT_0。
我想在我的线程里结束的时候,停止服务,但不知道该如何才能停止掉服务,试了很多都不行
如下: //InitCard();
handle = CreateThread(...ThreadFun,...);
DWORD dwRet = WaitForObject( handle, 10000 ); //等待10s
if ( dwRet == WAIT_TIMEOUT )
{
// 线程一直在运行,说明线程启动正常,所以进行消息循环
MSG msg;
while (GetMessage(&msg, 0, 0, 0))
DispatchMessage(&msg);
}
else
{
// 线程很快就终止了,说明线程没有正常启动,或者连接不上数据库
}
//ExitCard();
线程函数ThreadFun
{
....
handle = CreateThread( ...SubThread... )
WaitForSingleObject( handle, INFINITE ); //直到SubThread线程结束
... // 停止服务,就是不知道该如何写
return 0;
}