用MFC开发后台服务程序,能否用CDatabase等类? 请问:用MFC而不是用ATL开发的后台服务程序,能否用MFC库的类,如CDatabase,CString等类?谢谢! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 为什么不可以?用MFC类跟后台程序没有关系 但我在程序里面,引用CDatabase,就出错,现将代码粘贴如下,请大侠们指点迷津// ServiceTest.cpp : Defines the entry point for the application.#include <afxwin.h>#include "winsvc.h"#include "afxdb.h"#include "stdafx.h"#include "stdio.h"#include "tchar.h"//定义全局函数变量void Init();BOOL IsInstalled();BOOL Install();BOOL Uninstall();void LogEvent(LPCTSTR pszFormat, ...);void WINAPI ServiceMain();void WINAPI ServiceStrl(DWORD dwOpcode);TCHAR szServiceName[] = _T("ServiceTest");TCHAR szDescription[] = _T("Calculate Fee For Delete Or Change User");BOOL bInstall;SERVICE_STATUS_HANDLE hServiceStatus;SERVICE_STATUS status;DWORD dwThreadID;int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow){ Init(); dwThreadID = ::GetCurrentThreadId(); SERVICE_TABLE_ENTRY st[] = { { szServiceName, (LPSERVICE_MAIN_FUNCTION)ServiceMain }, { NULL, NULL } }; if (stricmp(lpCmdLine, "/install") == 0) { Install(); } else if (stricmp(lpCmdLine, "/uninstall") == 0) { Uninstall(); } else { if (!::StartServiceCtrlDispatcher(st)) { LogEvent(_T("Register Service Main Function Error!")); } } return 0;}//*********************************************************//Functiopn: Init//Description: 初始化//Calls: main//Called By: //Table Accessed: //Table Updated: //Input: //Output: //Return: //Others: //History: // <author>niying <time>2006-8-10 <version> <desc>//*********************************************************void Init(){ hServiceStatus = NULL; status.dwServiceType = SERVICE_WIN32_OWN_PROCESS; status.dwCurrentState = SERVICE_STOPPED; status.dwControlsAccepted = SERVICE_ACCEPT_STOP; status.dwWin32ExitCode = 0; status.dwServiceSpecificExitCode = 0; status.dwCheckPoint = 0; status.dwWaitHint = 0;}//*********************************************************//Functiopn: ServiceMain//Description: 服务主函数,这在里进行控制对服务控制的注册//Calls://Called By://Table Accessed://Table Updated://Input://Output://Return://Others://History:// <author>niying <time>2006-8-10 <version> <desc>//*********************************************************void WINAPI ServiceMain(){ // Register the control request handler status.dwCurrentState = SERVICE_START_PENDING; status.dwControlsAccepted = SERVICE_ACCEPT_STOP; //注册服务控制 hServiceStatus = RegisterServiceCtrlHandler(szServiceName, ServiceStrl); if (hServiceStatus == NULL) { LogEvent(_T("Handler not installed")); return; } SetServiceStatus(hServiceStatus, &status); status.dwWin32ExitCode = S_OK; status.dwCheckPoint = 0; status.dwWaitHint = 0; status.dwCurrentState = SERVICE_RUNNING; SetServiceStatus(hServiceStatus, &status); //模拟服务的运行,10后自动退出。应用时将主要任务放于此即可 int i = 0;// CDatabase m_Database; while (i < 120) { Sleep(1000); /*CString ConnectString="ODBC;DSN=xgbill;UID=sa;PWD=gomodel;DATABASE=xgbill"; try { m_Database.Open(NULL,FALSE,FALSE,ConnectString,FALSE) ; } catch(CDBException* pe) { //throw(pe->m_strError); pe->Delete(); return FALSE; } CString SqlStr="Insert Into Internalagent.CaiJiUserbill(telno,re) values('2959999','?1,20091201,20091222')"; m_Database.ExecuteSQL(SqlStr); m_Database.Close();*/ i++; } // status.dwCurrentState = SERVICE_STOPPED; SetServiceStatus(hServiceStatus, &status); LogEvent(_T("Service stopped"));}//*********************************************************//Functiopn: ServiceStrl//Description: 服务控制主函数,这里实现对服务的控制,// 当在服务管理器上停止或其它操作时,将会运行此处代码//Calls://Called By://Table Accessed://Table Updated://Input: dwOpcode:控制服务的状态//Output://Return://Others://History:// <author>niying <time>2006-8-10 <version> <desc>//*********************************************************void WINAPI ServiceStrl(DWORD dwOpcode){ switch (dwOpcode) { case SERVICE_CONTROL_STOP: status.dwCurrentState = SERVICE_STOP_PENDING; SetServiceStatus(hServiceStatus, &status); PostThreadMessage(dwThreadID, WM_CLOSE, 0, 0); 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")); }}//*********************************************************//Functiopn: IsInstalled//Description: 判断服务是否已经被安装//Calls://Called By://Table Accessed://Table Updated://Input://Output://Return://Others://History:// <author>niying <time>2006-8-10 <version> <desc>//*********************************************************BOOL IsInstalled(){ BOOL bResult = FALSE; //打开服务控制管理器 SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS); if (hSCM != NULL) { //打开服务 SC_HANDLE hService = ::OpenService(hSCM, szServiceName, SERVICE_QUERY_CONFIG); if (hService != NULL) { bResult = TRUE; ::CloseServiceHandle(hService); } ::CloseServiceHandle(hSCM); } return bResult;}//*********************************************************//Functiopn: Install//Description: 安装服务函数//Calls://Called By://Table Accessed://Table Updated://Input://Output://Return://Others://History:// <author>niying <time>2006-8-10 <version> <desc>//*********************************************************BOOL Install(){ if (IsInstalled()) return TRUE; //打开服务控制管理器 SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS); if (hSCM == NULL) { MessageBox(NULL, _T("Couldn't open service manager"), szServiceName, MB_OK); return FALSE; } // Get the executable file path TCHAR szFilePath[MAX_PATH]; ::GetModuleFileName(NULL, szFilePath, MAX_PATH); //创建服务 SC_HANDLE hService = ::CreateService( hSCM, szServiceName, szServiceName, SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS, SERVICE_AUTO_START, SERVICE_ERROR_NORMAL, szFilePath, NULL, NULL, _T(""), NULL, NULL); if (hService == NULL) { ::CloseServiceHandle(hSCM); MessageBox(NULL, _T("Couldn't create service"), szServiceName, MB_OK); return FALSE; } ::CloseServiceHandle(hService); ::CloseServiceHandle(hSCM); return TRUE;}//*********************************************************//Functiopn: Uninstall//Description: 删除服务函数//Calls://Called By://Table Accessed://Table Updated://Input://Output://Return://Others://History:// <author>niying <time>2006-8-10 <version> <desc>//*********************************************************BOOL Uninstall(){ if (!IsInstalled()) return TRUE; SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS); if (hSCM == NULL) { MessageBox(NULL, _T("Couldn't open service manager"), szServiceName, MB_OK); return FALSE; } SC_HANDLE hService = ::OpenService(hSCM, szServiceName, SERVICE_STOP | DELETE); if (hService == NULL) { ::CloseServiceHandle(hSCM); MessageBox(NULL, _T("Couldn't open service"), szServiceName, MB_OK); return FALSE; } SERVICE_STATUS status; ::ControlService(hService, SERVICE_CONTROL_STOP, &status); //删除服务 BOOL bDelete = ::DeleteService(hService); ::CloseServiceHandle(hService); ::CloseServiceHandle(hSCM); if (bDelete) return TRUE; LogEvent(_T("Service could not be deleted")); return FALSE;}//*********************************************************//Functiopn: LogEvent//Description: 记录服务事件//Calls://Called By://Table Accessed://Table Updated://Input://Output://Return://Others://History:// <author>niying <time>2006-8-10 <version> <desc>//*********************************************************void LogEvent(LPCTSTR pFormat, ...){ TCHAR chMsg[256]; HANDLE hEventSource; LPTSTR lpszStrings[1]; va_list pArg; va_start(pArg, pFormat); _vstprintf(chMsg, pFormat, pArg); va_end(pArg); lpszStrings[0] = chMsg; hEventSource = RegisterEventSource(NULL, szServiceName); if (hEventSource != NULL) { ReportEvent(hEventSource, EVENTLOG_INFORMATION_TYPE, 0, 0, NULL, 1, 0, (LPCTSTR*) &lpszStrings[0], NULL); DeregisterEventSource(hEventSource); }} 烦请大侠们帮我编译,看是否能通过!请去掉CDatabase m_Database前面的注释“//”后编译 用MFC类后,总不能使用CDatabase类,编译无法通过,故想请两位大侠帮忙 感觉3个角的人不应该有这样的疑问推荐ADO访问数据库 非常非常的郁懑,现在编译过了,服务安装也成功了,但在控制面板中,起动服务的时候出错,而不用MFC则不出错,运行很好,用了MFC则出错。因为服务的实现是用MFC中的CDatabase、CRecordset等类写的,因此不用MFC肯定不行,从昨天整到今天就快2天了,总是搞不定呀?!但在CSDN中查找到一个等级是三个红星的高手说过,写服务不能用MFC,要么用ATL,不知究单竟? 发烧了,难受啊 IWebBrowser2 *m_spBrowser问题 上网问题 请教大家一个有关CObArray 的问题,谢谢。 为什么无法打开磁盘卷??? 请问Clist的模版类是线程安全的吗?是否允许多线程同时访问 多个进程共享同一动态链接库(DLL)的问题 VC中如何调用 CrystalReport9 求教:一个很简单的问题。关于WINDOWS安装的问题。谢了!! mfc 单文档程序插入对话框出现闪屏 CFileDialog 怎样设置初始化的显示方式以缩略图的方式显示 IWebBrowser2::navigate 不成功,错误代码0x800700aa:请求资源在使用中
// ServiceTest.cpp : Defines the entry point for the application.#include <afxwin.h>
#include "winsvc.h"
#include "afxdb.h"
#include "stdafx.h"
#include "stdio.h"
#include "tchar.h"//定义全局函数变量
void Init();
BOOL IsInstalled();
BOOL Install();
BOOL Uninstall();
void LogEvent(LPCTSTR pszFormat, ...);
void WINAPI ServiceMain();
void WINAPI ServiceStrl(DWORD dwOpcode);TCHAR szServiceName[] = _T("ServiceTest");
TCHAR szDescription[] = _T("Calculate Fee For Delete Or Change User");BOOL bInstall;
SERVICE_STATUS_HANDLE hServiceStatus;
SERVICE_STATUS status;
DWORD dwThreadID;int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
Init(); dwThreadID = ::GetCurrentThreadId(); SERVICE_TABLE_ENTRY st[] =
{
{ szServiceName, (LPSERVICE_MAIN_FUNCTION)ServiceMain },
{ NULL, NULL }
}; if (stricmp(lpCmdLine, "/install") == 0)
{
Install();
}
else if (stricmp(lpCmdLine, "/uninstall") == 0)
{
Uninstall();
}
else
{
if (!::StartServiceCtrlDispatcher(st))
{
LogEvent(_T("Register Service Main Function Error!"));
}
} return 0;
}
//*********************************************************
//Functiopn: Init
//Description: 初始化
//Calls: main
//Called By:
//Table Accessed:
//Table Updated:
//Input:
//Output:
//Return:
//Others:
//History:
// <author>niying <time>2006-8-10 <version> <desc>
//*********************************************************
void Init()
{
hServiceStatus = NULL;
status.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
status.dwCurrentState = SERVICE_STOPPED;
status.dwControlsAccepted = SERVICE_ACCEPT_STOP;
status.dwWin32ExitCode = 0;
status.dwServiceSpecificExitCode = 0;
status.dwCheckPoint = 0;
status.dwWaitHint = 0;
}//*********************************************************
//Functiopn: ServiceMain
//Description: 服务主函数,这在里进行控制对服务控制的注册
//Calls:
//Called By:
//Table Accessed:
//Table Updated:
//Input:
//Output:
//Return:
//Others:
//History:
// <author>niying <time>2006-8-10 <version> <desc>
//*********************************************************
void WINAPI ServiceMain()
{
// Register the control request handler
status.dwCurrentState = SERVICE_START_PENDING;
status.dwControlsAccepted = SERVICE_ACCEPT_STOP; //注册服务控制
hServiceStatus = RegisterServiceCtrlHandler(szServiceName, ServiceStrl);
if (hServiceStatus == NULL)
{
LogEvent(_T("Handler not installed"));
return;
}
SetServiceStatus(hServiceStatus, &status); status.dwWin32ExitCode = S_OK;
status.dwCheckPoint = 0;
status.dwWaitHint = 0;
status.dwCurrentState = SERVICE_RUNNING;
SetServiceStatus(hServiceStatus, &status); //模拟服务的运行,10后自动退出。应用时将主要任务放于此即可
int i = 0;
// CDatabase m_Database;
while (i < 120)
{
Sleep(1000);
/*CString ConnectString="ODBC;DSN=xgbill;UID=sa;PWD=gomodel;DATABASE=xgbill";
try
{
m_Database.Open(NULL,FALSE,FALSE,ConnectString,FALSE) ;
}
catch(CDBException* pe)
{
//throw(pe->m_strError);
pe->Delete();
return FALSE;
}
CString SqlStr="Insert Into Internalagent.CaiJiUserbill(telno,re) values('2959999','?1,20091201,20091222')";
m_Database.ExecuteSQL(SqlStr);
m_Database.Close();*/
i++;
}
// status.dwCurrentState = SERVICE_STOPPED;
SetServiceStatus(hServiceStatus, &status);
LogEvent(_T("Service stopped"));
}//*********************************************************
//Functiopn: ServiceStrl
//Description: 服务控制主函数,这里实现对服务的控制,
// 当在服务管理器上停止或其它操作时,将会运行此处代码
//Calls:
//Called By:
//Table Accessed:
//Table Updated:
//Input: dwOpcode:控制服务的状态
//Output:
//Return:
//Others:
//History:
// <author>niying <time>2006-8-10 <version> <desc>
//*********************************************************
void WINAPI ServiceStrl(DWORD dwOpcode)
{
switch (dwOpcode)
{
case SERVICE_CONTROL_STOP:
status.dwCurrentState = SERVICE_STOP_PENDING;
SetServiceStatus(hServiceStatus, &status);
PostThreadMessage(dwThreadID, WM_CLOSE, 0, 0);
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"));
}
}
//*********************************************************
//Functiopn: IsInstalled
//Description: 判断服务是否已经被安装
//Calls:
//Called By:
//Table Accessed:
//Table Updated:
//Input:
//Output:
//Return:
//Others:
//History:
// <author>niying <time>2006-8-10 <version> <desc>
//*********************************************************
BOOL IsInstalled()
{
BOOL bResult = FALSE; //打开服务控制管理器
SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS); if (hSCM != NULL)
{
//打开服务
SC_HANDLE hService = ::OpenService(hSCM, szServiceName, SERVICE_QUERY_CONFIG);
if (hService != NULL)
{
bResult = TRUE;
::CloseServiceHandle(hService);
}
::CloseServiceHandle(hSCM);
}
return bResult;
}//*********************************************************
//Functiopn: Install
//Description: 安装服务函数
//Calls:
//Called By:
//Table Accessed:
//Table Updated:
//Input:
//Output:
//Return:
//Others:
//History:
// <author>niying <time>2006-8-10 <version> <desc>
//*********************************************************
BOOL Install()
{
if (IsInstalled())
return TRUE; //打开服务控制管理器
SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
if (hSCM == NULL)
{
MessageBox(NULL, _T("Couldn't open service manager"), szServiceName, MB_OK);
return FALSE;
} // Get the executable file path
TCHAR szFilePath[MAX_PATH];
::GetModuleFileName(NULL, szFilePath, MAX_PATH); //创建服务
SC_HANDLE hService = ::CreateService(
hSCM, szServiceName, szServiceName,
SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS,
SERVICE_AUTO_START, SERVICE_ERROR_NORMAL,
szFilePath, NULL, NULL, _T(""), NULL, NULL); if (hService == NULL)
{
::CloseServiceHandle(hSCM);
MessageBox(NULL, _T("Couldn't create service"), szServiceName, MB_OK);
return FALSE;
} ::CloseServiceHandle(hService);
::CloseServiceHandle(hSCM);
return TRUE;
}//*********************************************************
//Functiopn: Uninstall
//Description: 删除服务函数
//Calls:
//Called By:
//Table Accessed:
//Table Updated:
//Input:
//Output:
//Return:
//Others:
//History:
// <author>niying <time>2006-8-10 <version> <desc>
//*********************************************************
BOOL Uninstall()
{
if (!IsInstalled())
return TRUE; SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS); if (hSCM == NULL)
{
MessageBox(NULL, _T("Couldn't open service manager"), szServiceName, MB_OK);
return FALSE;
} SC_HANDLE hService = ::OpenService(hSCM, szServiceName, SERVICE_STOP | DELETE); if (hService == NULL)
{
::CloseServiceHandle(hSCM);
MessageBox(NULL, _T("Couldn't open service"), szServiceName, MB_OK);
return FALSE;
}
SERVICE_STATUS status;
::ControlService(hService, SERVICE_CONTROL_STOP, &status); //删除服务
BOOL bDelete = ::DeleteService(hService);
::CloseServiceHandle(hService);
::CloseServiceHandle(hSCM); if (bDelete)
return TRUE; LogEvent(_T("Service could not be deleted"));
return FALSE;
}//*********************************************************
//Functiopn: LogEvent
//Description: 记录服务事件
//Calls:
//Called By:
//Table Accessed:
//Table Updated:
//Input:
//Output:
//Return:
//Others:
//History:
// <author>niying <time>2006-8-10 <version> <desc>
//*********************************************************
void LogEvent(LPCTSTR pFormat, ...)
{
TCHAR chMsg[256];
HANDLE hEventSource;
LPTSTR lpszStrings[1];
va_list pArg; va_start(pArg, pFormat);
_vstprintf(chMsg, pFormat, pArg);
va_end(pArg); lpszStrings[0] = chMsg;
hEventSource = RegisterEventSource(NULL, szServiceName);
if (hEventSource != NULL)
{
ReportEvent(hEventSource, EVENTLOG_INFORMATION_TYPE, 0, 0, NULL, 1, 0, (LPCTSTR*) &lpszStrings[0], NULL);
DeregisterEventSource(hEventSource);
}
}
感觉3个角的人不应该有这样的疑问
推荐ADO访问数据库
但在CSDN中查找到一个等级是三个红星的高手说过,写服务不能用MFC,要么用ATL,不知究单竟?