有谁做过c/s 结构的程序吗,我用vc框架想把server端做成一个service,我查了若干用于做服务的API,StartServiceCtrlDispatcher,RegisterServiceCtrlHandler,CreateThread等,在win32  Console  Application 下我RegisterServiceCtrlHandler注册了一个服务,然后用CreateThread来建了条线程运行一段程序,这样可以,但问题是怎么去运行带有对话框的MFC AppWizard (exe)整个应用程序框架呢,.我对于MFC不怎么懂,不知道用于建服务的API该写在哪里,是OnInitDialog()里面吗,要不要用到线程呢?还请高人指点!

解决方案 »

  1.   

    /***************************************************************************
     *                                                                         *
     *   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;
    }
      

  2.   

    你看看myicq是怎么做的你就知道了.安装/卸载 和 启动 服务是不一样的运行时间.
    --
    serviceMain 应该才是你启动MFC程序的地方.
      

  3.   

    带有GDI的程序不允许作成服务,就算作成服务也回随注销而退出.
    必须没有图形界面,你为什么不考虑使用两个程序呢?他们可以相互调用呀!
    服务没有图形界面,但当收到呼出消息就运行另外一个程序显示控制台!
      

  4.   

    我这里有介绍:http://blog.csdn.net/niying,需要源码的话我可以给你。