有谁做过c/s 结构的程序吗,我用vc框架想把server端做成一个service,我查了若干用于做服务的API,StartServiceCtrlDispatcher,RegisterServiceCtrlHandler,CreateThread等,在win32 Console Application 下我RegisterServiceCtrlHandler注册了一个服务,然后用CreateThread来建了条线程运行一段程序,这样可以,但问题是怎么去运行带有对话框的MFC AppWizard (exe)整个应用程序框架呢,.我对于MFC不怎么懂,不知道用于建服务的API该写在哪里,是OnInitDialog()里面吗,要不要用到线程呢?还请高人指点!
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* copyright : (C) 2002 by Zhang Yong *
* email : [email protected] *
***************************************************************************/#include <windows.h>
#include <iostream.h>
#include "myicq.h"
#include "log.h"
#define SERVICE_NAME "myicqd"static SERVICE_STATUS serviceStatus;
static SERVICE_STATUS_HANDLE hServiceStatus;bool myicqStart();static void setStatus(DWORD status)
{
serviceStatus.dwCurrentState = status;
SetServiceStatus(hServiceStatus, &serviceStatus);
}static VOID WINAPI serviceCtrlHandler(DWORD opcode)
{
switch (opcode) {
case SERVICE_CONTROL_STOP:
setStatus(SERVICE_STOPPED);
break;
}
}static VOID WINAPI serviceMain(DWORD argc, LPTSTR *argv)
{
ZeroMemory(&serviceStatus, sizeof(serviceStatus));
serviceStatus.dwServiceType = SERVICE_WIN32;
serviceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP; hServiceStatus = RegisterServiceCtrlHandler(SERVICE_NAME, serviceCtrlHandler);
if (!hServiceStatus) {
LOG(1) ("RegisterServiceCtrlHandler() failed\n");
return;
} // Starting myicqd...
setStatus(SERVICE_START_PENDING); if (!myicqStart()) {
setStatus(SERVICE_STOPPED);
return;
} // myicqd is now started
setStatus(SERVICE_RUNNING); handlePacket(); myicqDestroy();
}
bool installService()
{
SC_HANDLE hSCM = OpenSCManager(NULL, NULL, SC_MANAGER_CREATE_SERVICE);
if (!hSCM) {
cerr << "Can not open SCM" << endl;
return false;
} char pathName[_MAX_PATH];
GetModuleFileName(NULL, pathName, _MAX_PATH);
SC_HANDLE hService = CreateService(
hSCM,
SERVICE_NAME,
"MyICQ",
SERVICE_ALL_ACCESS,
SERVICE_WIN32_OWN_PROCESS,
SERVICE_DEMAND_START,
SERVICE_ERROR_NORMAL,
pathName,
NULL,
NULL,
NULL, // No dependence, since mysqld may run on another server
NULL,
NULL
); bool ret = false;
if (hService) {
ret = true;
CloseServiceHandle(hService);
} else
cerr << "CreateService() failed" << endl; CloseServiceHandle(hSCM); return ret;
}bool removeService()
{
SC_HANDLE hSCM = OpenSCManager(NULL, NULL, 0);
if (!hSCM) {
cerr << "Can not open SCM" << endl;
return false;
} bool ret = false; SC_HANDLE hService = OpenService(hSCM, SERVICE_NAME, DELETE);
if (hService) {
if (DeleteService(hService))
ret = true;
else
cerr << "DeleteService() failed" << endl;
CloseServiceHandle(hService);
} else
cerr << "OpenService() failed" << endl; CloseServiceHandle(hSCM);
return ret;
}bool startService()
{
static SERVICE_TABLE_ENTRY dispatchTable[] = {
{ SERVICE_NAME, serviceMain },
{ NULL, NULL }
}; if (!StartServiceCtrlDispatcher(dispatchTable))
return false; return true;
}
--
serviceMain 应该才是你启动MFC程序的地方.
必须没有图形界面,你为什么不考虑使用两个程序呢?他们可以相互调用呀!
服务没有图形界面,但当收到呼出消息就运行另外一个程序显示控制台!