⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 comserver.cpp

📁 DCOM 上位机和嵌入式系统通信
💻 CPP
字号:
// ComServer.cpp : Implementation of WinMain


// Note: Proxy/Stub Information
//      To build a separate proxy/stub DLL, 
//      run nmake -f ComServerps.mk in the project directory.

#include "stdafx.h"
#include "resource.h"
#include <initguid.h>
#include "ComServer.h"

#include "ComServer_i.c"
#include "Server1.h"
#include "Server2.h"
#include "Server3.h"
#include "hotuse.h"
#include "capid.h"
#include "rjremote.h"
#include "netweb.h"
#include "reg.h"
//#include "reg.h"
//#include "testinterface.h"


const DWORD dwTimeOut = 5000; // time for EXE to be idle before shutting down
const DWORD dwPause = 1000; // time to wait for threads to finish up
Alarm alarmrecord;
alarmold alarmoldrecord;
 errorx errorrecord;
 errorold erroroldrecord;
 system_struction Files;
 station_exd st_exd;
 all_INI st_ini[255];
 Kjsys001 File1;
 point_type_struct File2;
 sensor_unit_struct File3;
 kjsys004 File4;
 kjsys005 File5;
 station_port_struct File6;
 system_station_cfg0 Cfg0;
 system_station_cfg1 Cfg1;
 system_station_cfg2 Cfg2;
 system_station_cfg3 Cfg3;
 system_station_cfg4 Cfg4;
 all_xinxi station_xinxi[255];
 nowdata Timedata;
 int minute_flg;//2分钟写库标志,由数据库进程置TRUE。数据处理进程清FALSE
 int hour_flg;//1小时写库标志,由数据库进程置TRUE。数据处理进程清FALSE
 yddd1 yddds;
 long kckzt[255]; //: 开出控制口 :word
 int copy_flag;   //拷贝标志
 qydd station_qydd;
 translate Translate[8];
 Station  stations[8];
 int kckz[255];
 Console0out console0out;
 Console1out console1out;
 Console1out ctrout[20];
 S_buf sendbuf[8][10];
 station_info stinfo;
 HANDLE hf;
 int fix_stno;
 unsigned char ordbuf[300];
 unsigned char recvbuf[300];
 BOOL resendflag;
 BOOL fz_ini_req;
 byte rjAlarmState[255]; //人员分站的当前报警状态: 1报警,0非报警

// opcsrvdef opcsrv[3];
 del_sensor delflg;
 BOOL con_del;//测点删除标志,由测点删除客户进程设置TRUE,数据处理进程清FALSE
 BOOL dat_del;//数据处理进程设置TRUE,通知数据库进程删除测定表
// station_info  stationinfo[8];
 kttp ktp;
 kai_chuSBpz KAI_CHUSBpz;      //贺增加   2005-4-15
 short passtmct;  //网络用超时人数
 Now_kckh kch[500];  //开出口状态
 short reset_num[255];  //复电次数
 kgbh kgch;

 long counter0=0;
 long counter1=0;
 tracetj  trctjb[1000];
 tracetj  trclst[1000];  
 
 //------by QuanGuo 05-3-1-----//
 
 fieldlist  fieldtj[200];
 fieldlist  fieldtjb[200];
 short fieldlistct;
 short fieldlist_ct;
 rjalarmlist  rjalarmtj[200];
 rjalarmlist  rjalarmtjb[200];
 short rjalarmct;
 short rjalarm_ct;
//-----------------------------//

 Rstations  rtinfo;
 preflist  prst;
 managerlist manager;
 addrlist  adlst;
 //05-4-17 add Begin
 short staTrouble;
 short staRecvNull[255];
 //05-4-17 add End
 personlist perstmb[4096];
 //DATE  rstm[255];
 short addrperson[50];
 short rj_ct;
// short tmgate1;
// short tmgate2;
 DWORD yddd_time_flag[255];
 //int yddd_flag1[255][16];
 int send_flag[255]; 
 int yddd_flag[255];
 int traceNum;
 int trace_notice;
 BOOL trac_flg;
 unsigned char Curpath[50];

 unsigned char otherpcname[33];
 
 int load_flg;

 BOOL tmok;
 short lastime[3];
 //lastinfo last[255];

 BOOL comsertype;  //0:  辅机,1:主机
 BOOL tranflg;  

 DDDJ_STRUC  dddj;
 DDBJ_STRUC  ddbj;

 float Alarm_Avge[500];
 float Alarm_Flag[ 500 ];
 BOOL scanflg;

 tjupdow  uptj[200];
 tjupdow  uptjb[200];
 short upct;
 short up_ct;
 tracetj  almtj[500];
 tracetj  almtjb[500]; 
 short almct; 
 short alm_ct; 

  tracetj  net_trace[2000];    
  short net_trc_ct;
  tracetj  net_alarm[1000]; 
  short net_alm_ct;
  tjupdow  net_uptj[400];
  short net_uptj_ct;
  short chkup[200];
  short chkct;
  drivePT devpoint;
  BOOL demosys;
  int democount;
  HANDLE termhd;
 //long dtbufptr;
 //unsigned char infobuf[32768];
// Passed to CreateThread to monitor the shutdown event
static DWORD WINAPI MonitorProc(void* pv)
{
    CExeModule* p = (CExeModule*)pv;
    p->MonitorShutdown();
    return 0;
}

LONG CExeModule::Unlock()
{
    LONG l = CComModule::Unlock();
    if (l == 0)
    {
        bActivity = true;
        SetEvent(hEventShutdown); // tell monitor that we transitioned to zero
    }
    return l;
}

//Monitors the shutdown event
void CExeModule::MonitorShutdown()
{
    while (1)
    {
        WaitForSingleObject(hEventShutdown, INFINITE);
        DWORD dwWait=0;
        do
        {
            bActivity = false;
            dwWait = WaitForSingleObject(hEventShutdown, dwTimeOut);
        } while (dwWait == WAIT_OBJECT_0);
        // timed out
        if (!bActivity && m_nLockCnt == 0) // if no activity let's really bail
        {
#if _WIN32_WINNT >= 0x0400 & defined(_ATL_FREE_THREADED)
            CoSuspendClassObjects();
            if (!bActivity && m_nLockCnt == 0)
#endif
                break;
        }
    }
    CloseHandle(hEventShutdown);
    PostThreadMessage(dwThreadID, WM_QUIT, 0, 0);
}

bool CExeModule::StartMonitor()
{
    hEventShutdown = CreateEvent(NULL, false, false, NULL);
    if (hEventShutdown == NULL)
        return false;
    DWORD dwThreadID;
    HANDLE h = CreateThread(NULL, 0, MonitorProc, this, 0, &dwThreadID);
    return (h != NULL);
}

CExeModule _Module;

BEGIN_OBJECT_MAP(ObjectMap)
OBJECT_ENTRY(CLSID_Server1, Server1)
OBJECT_ENTRY(CLSID_Server2, Server2)
OBJECT_ENTRY(CLSID_Server3, Server3)
//OBJECT_ENTRY(CLSID_testinterface, Ctestinterface)
OBJECT_ENTRY(CLSID_personproc, Cpersonproc)
OBJECT_ENTRY(CLSID_rjinteface, Crjinteface)
OBJECT_ENTRY(CLSID_opcinteface, Copcinteface)
OBJECT_ENTRY(CLSID_hotuse, Chotuse)
OBJECT_ENTRY(CLSID_capid, Ccapid)
OBJECT_ENTRY(CLSID_rjremote, Crjremote)
OBJECT_ENTRY(CLSID_netweb, Cnetweb)
//OBJECT_ENTRY(CLSID_reg, Creg)
OBJECT_ENTRY(CLSID_reg, Creg)
END_OBJECT_MAP()


LPCTSTR FindOneOf(LPCTSTR p1, LPCTSTR p2)
{
    while (p1 != NULL && *p1 != NULL)
    {
        LPCTSTR p = p2;
        while (p != NULL && *p != NULL)
        {
            if (*p1 == *p)
                return CharNext(p1);
            p = CharNext(p);
        }
        p1 = CharNext(p1);
    }
    return NULL;
}

/////////////////////////////////////////////////////////////////////////////
//
extern "C" int WINAPI _tWinMain(HINSTANCE hInstance, 
    HINSTANCE /*hPrevInstance*/, LPTSTR lpCmdLine, int /*nShowCmd*/)
{
    lpCmdLine = GetCommandLine(); //this line necessary for _ATL_MIN_CRT
#if _WIN32_WINNT >= 0x0400 & defined(_ATL_FREE_THREADED)
    HRESULT hRes = CoInitializeEx(NULL, COINIT_MULTITHREADED);
#else
    HRESULT hRes = CoInitialize(NULL);
#endif
    _ASSERTE(SUCCEEDED(hRes));
    _Module.Init(ObjectMap, hInstance, &LIBID_COMSERVERLib);
    _Module.dwThreadID = GetCurrentThreadId();
    TCHAR szTokens[] = _T("-/");

    int nRet = 0;
    BOOL bRun = TRUE;
    LPCTSTR lpszToken = FindOneOf(lpCmdLine, szTokens);
    while (lpszToken != NULL)
    {
        if (lstrcmpi(lpszToken, _T("UnregServer"))==0)
        {
            _Module.UpdateRegistryFromResource(IDR_ComServer, FALSE);
            nRet = _Module.UnregisterServer(TRUE);
            bRun = FALSE;
            break;
        }
        if (lstrcmpi(lpszToken, _T("RegServer"))==0)
        {
            _Module.UpdateRegistryFromResource(IDR_ComServer, TRUE);
            nRet = _Module.RegisterServer(TRUE);
            bRun = FALSE;
            break;
        }
        lpszToken = FindOneOf(lpszToken, szTokens);
    }

    if (bRun)
    {
        _Module.StartMonitor();
#if _WIN32_WINNT >= 0x0400 & defined(_ATL_FREE_THREADED)
        hRes = _Module.RegisterClassObjects(CLSCTX_LOCAL_SERVER, 
            REGCLS_MULTIPLEUSE | REGCLS_SUSPENDED);
        _ASSERTE(SUCCEEDED(hRes));
        hRes = CoResumeClassObjects();
#else
        hRes = _Module.RegisterClassObjects(CLSCTX_LOCAL_SERVER, 
            REGCLS_MULTIPLEUSE);
#endif
        _ASSERTE(SUCCEEDED(hRes));

        MSG msg;
        while (GetMessage(&msg, 0, 0, 0))
            DispatchMessage(&msg);

        _Module.RevokeClassObjects();
        Sleep(dwPause); //wait for any threads to finish
    }

    _Module.Term();
    CoUninitialize();
    return nRet;
}






⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -