衡玉's Blog

Happy coding

 ATL创建的windows服务,只是负责控制,而将业务逻辑放在mfc的dll中,建立线程后,在发送消息,代码如下

 

extern "C" __declspec(dllexport) void _DllMain()
{
	unsigned nThreadId;
	HANDLE hThread = (HANDLE)_beginthreadex(NULL,0, &ThreadMain,NULL, 0, &nThreadId);
	Sleep(1000);
	PostThreadMessage(nThreadId, WM_TIMEISUP, NULL, NULL);
}

unsigned __stdcall ThreadMain(LPVOID pParam)
{
	MSG msg;
	while(true){
		if(::GetMessage(&msg, NULL, NULL, NULL)) {
			switch(msg.message){
				case WM_TIMEISUP:
				{
					Download d;
					break;
				}
				default:
					break;
			}
		}
	};
	
	/*
	MSG msg;
	while(::PeekMessage(&msg, NULL, NULL, NULL, PM_REMOVE)) {
		switch(msg.message) {
			case WM_TIMEISUP:
			{
				Download d;
				break;
			}
			default:
				break;
		}
	}*/
	return 0;
}

 

 

 服务启动后再停止时出错,是因为我在成员函数PreMessageLoop()函数中缺少控制代码所致,控制代码如下:

 

HRESULT CRestoreSerModule::PreMessageLoop(int nShowCmd)
{
	m_status.dwControlsAccepted = m_status.dwControlsAccepted | SERVICE_ACCEPT_PAUSE_CONTINUE;
	HRESULT hr = __super::PreMessageLoop(nShowCmd);
	if (hr == S_FALSE)
		hr = S_OK;
	return hr;
}

 

加上这些代码即可正常启动、停止了。

至于无法删除,

[SC] deleteservice FAILD 1072    这个错误是因为停止没有相应,所以控制器上好像停止了,可是程序依然在运行,打开任务管理器,结束这个进程,在删除就没有问题了。