rtdbm.cpp

来自「这是一个在正实际应用当中运行的电力监控系统软件源代码」· C++ 代码 · 共 1,339 行 · 第 1/3 页

CPP
1,339
字号
{
  if ((Msg.WParam & 0xFFF0) == CM_U_ABORT)
        GetApplication ()->ExecDialog (new TDialog (this,"AboutBox"));
  else  DefWndProc (Msg);
}

void RtdbmWindow::WMSize (RTMessage Msg)
{
    TWindow::WMSize (Msg);
    PostMessage (HWindow, WM_SYSCOMMAND, SC_MINIMIZE, 0L);
} */
//============================================================================
// 下面的程序是关于DDE的,暂时不用,以后需要可根据具体情况修改后使用
//
//HDDEDATA FAR PASCAL _export RtdbmWindow::CallBack (WORD wType, WORD wFmt, HCONV hConv, HSZ hsz1, HSZ hsz2, HDDEDATA hData, DWORD, DWORD)
HDDEDATA FAR PASCAL _export RtdbmWindow::TczCallBack (WORD wType, WORD wFmt, HCONV hConv, HSZ hsz1, HSZ hsz2, HDDEDATA hData, DWORD, DWORD)
{
		 if (wType==XTYP_CONNECT_CONFIRM) return (HDDEDATA)0;
		 if (wType==XTYP_POKE)
		 {FreeAllDBFile();
		 LoadAllDBFile();
         }
}

DWORD FAR  idInst;
HSZ TczService,TczTopic,TczItem;
void StartDDEForRtdbm ()
{
        if (DdeInitialize (&idInst, (PFNCALLBACK)CallBack, APPCLASS_STANDARD, 0L) == DMLERR_NO_ERROR)    {
            TczService = DdeCreateStringHandle (idInst, "唐增明", CP_WINANSI);
            TczTopic = DdeCreateStringHandle (idInst, "Tzm", CP_WINANSI);
            TczItem = DdeCreateStringHandle (idInst, "Tcz", CP_WINANSI);
            }
            DdeNameService (idInst, TczService, NULL, DNS_REGISTER); 
}
/*
void RtdbmWindow::StartDDE (int i)
{
    idInst[i] = 0L;
    hConv[i] = 0;
    tfLoop[i] = FALSE;
    hszService[i] = hszTopic[i] = hszItem[i] = 0;

    if (lpfnCallBack[i] != NULL) {
        if (DdeInitialize (&idInst[i], (PFNCALLBACK)lpfnCallBack[i], APPCLASS_STANDARD, 0L) == DMLERR_NO_ERROR)    {
            hszService[i] = DdeCreateStringHandle (idInst[i], ServiceName[i], CP_WINANSI);
            hszTopic[i] = DdeCreateStringHandle (idInst[i], "YuanDeHai", CP_WINANSI);
            hszItem[i] = DdeCreateStringHandle (idInst[i], "SCADA", CP_WINANSI);
            if ((hszService[i] != NULL) && (hszTopic[i] != NULL) && (hszItem[i] != NULL)) {
               if (DdeNameService (idInst[i], hszService[i], NULL, DNS_REGISTER) == 0) {
                   MessageBox (NULL, "DdeNameService is error", "error", MB_OK);
                   return;
               }
            }
			else {
                MessageBox (NULL, "hszService is Null", "error", MB_OK);
                return ;
            }
        }
        else {
            MessageBox (NULL, "DdeInit is error", "error", MB_OK);
			return ;
        }
    }
    else {
        MessageBox (NULL, "CallBack is NULL", "error", MB_OK);
        return ;
    }
} */
//
/*
void RtdbmWindow::EndDDE (int i)
{
        if (hConv[i] != 0)
        {
          DdeDisconnect (hConv[i]);
          hConv[i] = 0;
        }

        if (idInst[i] != 0)
    {
          DdeNameService (idInst[i], hszService[i], NULL, DNS_UNREGISTER);
      if (hszService[i] != NULL)
          {
		DdeFreeStringHandle (idInst[i], hszService[i]);
        hszService[i] = NULL;
          }
          if (hszTopic[i] != NULL)
          {
        DdeFreeStringHandle (idInst[i], hszTopic[i]);
        hszTopic[i] = NULL;
          }
          if (hszItem[i] != NULL)
          {
        DdeFreeStringHandle (idInst[i], hszItem[i]);
        hszItem[i] = NULL;
          }
          DdeUninitialize (idInst[i]);
        }
        if (lpfnCallBack[i] != NULL)
        {
          FreeProcInstance (lpfnCallBack[i]);
          lpfnCallBack[i] = NULL;
        }
} */
//

/*
This function is used to compare incoming Topic and Service requests.
This example DDE Server only makes one Service and one Topic available
so the logic is simple for this case but could be more complex for
Servers that offer multiple Services or Topics.
*/
/*
BOOL RtdbmWindow::MatchTopicAndService (BYTE i, HSZ hsz1, HSZ hsz2)
{
    if (DdeCmpStringHandles (hszTopic[i], hsz1) == 0)
        if (DdeCmpStringHandles (hszService[i], hsz2) == 0)
            return TRUE;
    return FALSE;
}
*/
/*
This function is used to compare incoming Topic and Item pair requests.
This Server only makes one Topic with one Item available so the logic is
simple for this case but could be more complex if the Server offered
multiple Items for multiple Topics.
*/
/*
BOOL RtdbmWindow::MatchTopicAndItem (BYTE i, HSZ hsz1, HSZ hsz2)
{
    if (DdeCmpStringHandles (hszTopic[i], hsz1) == 0)
        if (DdeCmpStringHandles (hszItem[i], hsz2) == 0)
            return TRUE;
    return FALSE;
}
*/
/*
This function responds to 'system wide' polling of any available
Services with specific Topics, any Topics with specific Services or any
Services with any Topics.  It simply replies with a match, if there is
one, so that the polling application can open data discussions later, if
desired.
*/
/*
HDDEDATA RtdbmWindow::WildConnect (BYTE i, HSZ hsz1, HSZ hsz2, WORD wFmt)
{
    HSZPAIR hszpTemp[] = { { hszService[i], hszTopic[i] }, { 0, 0 } };

    if (hsz1==NULL && hsz2==NULL)      // Returns all if true
        return DdeCreateDataHandle (idInst[i], (LPBYTE)&hszpTemp[0], sizeof(hszpTemp), 0L, 0, wFmt, 0);
    if (hsz1==NULL && DdeCmpStringHandles(hsz2,hszService[i])==0)
        return DdeCreateDataHandle (idInst[i], (LPBYTE)&hszpTemp[0], sizeof(hszpTemp), 0L, 0, wFmt, 0);
    if (DdeCmpStringHandles(hsz1,hszTopic[i])==0 && hsz2==NULL)
        return DdeCreateDataHandle (idInst[i], (LPBYTE)&hszpTemp[0], sizeof(hszpTemp), 0L, 0, wFmt, 0);
    return NULL;
}

HDDEDATA RtdbmWindow::DataRequested (BYTE i, WORD wFmt)
{
    HDDEDATA hdata;
    char str[20];
    wsprintf (str,"%lu",Addr);
    if (wFmt == CF_TEXT) {
        hdata = DdeCreateDataHandle (idInst[i], str, sizeof(str), 0, hszItem[i], wFmt, 0);
        if (hdata !=NULL) return hdata;
        UINT ret = DdeGetLastError (idInst[i]);
        wsprintf (str,"%ld",ret);
        MessageBox (GetFocus (),str,"error",MB_OK);
    }
    else MessageBox (GetFocus (),"is not CF_TEXT","error",MB_OK);
    return (HDDEDATA)0;
}
*/
/*
This is triggered by the IdleAction () loop above whenever the user
enters an advise loop.
*/
/*
void RtdbmWindow::UpdateData (BYTE i)
{
    DdePostAdvise (idInst[i], hszTopic[i], hszItem[i]);
}
*/
/*
void RtdbmWindow::SendMsg ()
{
  if (hConv[0] != 0)
    PostMessage (Addr->HDispatching,WM_REQUEST,0,0L);
  if (hConv[1] != 0)
    PostMessage (Addr->HDBMS,WM_REQUEST,0,0L);
  if (hConv[2] != 0)
    PostMessage (Addr->HTable,WM_REQUEST,0,0L);
  if (hConv[3] != 0)
    PostMessage (Addr->HFHKZ,WM_REQUEST,0,0L);
  if (hConv[4] != 0)
    PostMessage (Addr->HPaint,WM_REQUEST,0,0L);
  if (hConv[5] != 0)
    PostMessage (Addr->HPaint,WM_REQUEST,0,0L);
  if (hConv[6] != 0)
    PostMessage (Addr->HPrintEvent,WM_REQUEST,0,0L);
  if (hConv[7] != 0)
    PostMessage (Addr->HMNP,WM_REQUEST,0,0L);
  if (hConv[8] != 0)
    PostMessage (Addr->HPAS,WM_REQUEST,0,0L);
  if (hConv[9] != 0)
    PostMessage (Addr->HRealDB,WM_REQUEST,0,0L);
  if (hConv[10] != 0)
    PostMessage (Addr->HPAS,WM_REQUEST,0,0L);
  if (hConv[11] != 0)
    PostMessage (Addr->HPAS,WM_REQUEST,0,0L);
}
*/
/*
This call back function is the heart of interaction between this program
and DDE.  Because Windows doesn't pass C++ 'this' pointers to call
back functions, a static 'this' pointer was used.  If you wanted to
create a Server that would allow for more than one conversation, using a
List of conversations and their associated 'this' pointers would be one
possible method to try.  The XTYP_ constants are described in detail in
the online help.
*/
/*
char far szTemp[128];
HDDEDATA FAR PASCAL _export RtdbmWindow::CallBack0 (WORD wType, WORD wFmt, HCONV hConv, HSZ hsz1, HSZ hsz2, HDDEDATA hData, DWORD, DWORD)
{
    switch (wType)
    {
        case XTYP_ADVREQ :
            if (pStaticThis->MatchTopicAndItem (0, hsz1, hsz2) == TRUE)
            {
                return pStaticThis->DataRequested (0, wFmt);
            }
            return (HDDEDATA)0;
        case XTYP_ADVSTART :
            if ((pStaticThis->tfLoop[0] == FALSE) && (pStaticThis->MatchTopicAndItem (0, hsz1, hsz2) == TRUE))
            {
                pStaticThis->tfLoop[0] = TRUE;
                return (HDDEDATA)1;
            } else {
                return (HDDEDATA)0;
            }
        case XTYP_ADVSTOP :
            if ((pStaticThis->tfLoop[0] == TRUE) && (pStaticThis->MatchTopicAndItem (0, hsz1, hsz2) == TRUE))
            {
                pStaticThis->tfLoop[0] = FALSE;
            }
            break;
        case XTYP_CONNECT :
            if (pStaticThis->hConv[0] == 0)
            {
                if (pStaticThis->MatchTopicAndService (0, hsz1, hsz2) == TRUE)
                {
                    return (HDDEDATA)1;
                }
            }
            return (HDDEDATA)0;
        case XTYP_CONNECT_CONFIRM :
            pStaticThis->hConv[0] = hConv;
            break;
        case XTYP_DISCONNECT :
            if (hConv == pStaticThis->hConv[0])
            {
                pStaticThis->hConv[0] = 0;
                pStaticThis->tfLoop[0] = FALSE;
            }
            break;
        case XTYP_ERROR :
            wsprintf (szTemp, "The server[0] received : ");
            MessageBox (pStaticThis->HWindow, "A critical DDE error has occured.", pStaticThis->Title, MB_ICONINFORMATION);
            break;
        case XTYP_EXECUTE :
            return DDE_FNOTPROCESSED;
        case XTYP_POKE :
            DdeGetData (hData, &Addr->HDispatching, sizeof(Addr->HDispatching), 0);
//            wsprintf (szTemp, "Server[0] Received HDispatching = %x ", Addr->HDispatching);
//            MessageBox (GetFocus (), szTemp, pStaticThis->Title, MB_ICONINFORMATION);
            pStaticThis->SendMsg ();
            return (HDDEDATA)DDE_FACK;
        case XTYP_REQUEST :
            if (pStaticThis->MatchTopicAndItem (0, hsz1, hsz2) == TRUE)
            {
                return pStaticThis->DataRequested (0, wFmt);
            }
            return NULL;
        case XTYP_WILDCONNECT :
            return pStaticThis->WildConnect (0, hsz1, hsz2, wFmt);
    default :
            break;
    }
    return (HDDEDATA)0;
}

HDDEDATA FAR PASCAL _export DDESrvWindow::CallBack1 (WORD wType, WORD wFmt, HCONV hConv, HSZ hsz1, HSZ hsz2, HDDEDATA hData, DWORD, DWORD)
{
    switch (wType)
    {
        case XTYP_ADVREQ :
			if (pStaticThis->MatchTopicAndItem (1, hsz1, hsz2) == TRUE)
            {
                return pStaticThis->DataRequested (1, wFmt);
            }

            return NULL;
        case XTYP_ADVSTART :
            if ((pStaticThis->tfLoop[1] == FALSE) && (pStaticThis->MatchTopicAndItem (1, hsz1, hsz2) == TRUE))
            {
                pStaticThis->tfLoop[1] = TRUE;
        return (HDDEDATA)1;
            } else {
                return 0;
            }
        case XTYP_ADVSTOP :
            if ((pStaticThis->tfLoop[1] == TRUE) && (pStaticThis->MatchTopicAndItem (1, hsz1, hsz2) == TRUE))
            {
                pStaticThis->tfLoop[1] = FALSE;
            }
            break;
        case XTYP_CONNECT :
            if (pStaticThis->hConv[1] == 0)
            {
                if (pStaticThis->MatchTopicAndService (1, hsz1, hsz2) == TRUE)
                {
                    return (HDDEDATA)1;
                }
            }
            return 0;
        case XTYP_CONNECT_CONFIRM :
            pStaticThis->hConv[1] = hConv;
            break;
        case XTYP_DISCONNECT :
            if (hConv == pStaticThis->hConv[1])
            {
                pStaticThis->hConv[1] = 0;
                pStaticThis->tfLoop[1] = FALSE;
            }
	    break;
        case XTYP_ERROR :
            wsprintf (szTemp, "The server[1] received : ");
            MessageBox (pStaticThis->HWindow, "A critical DDE error has occured.", pStaticThis->Title, MB_ICONINFORMATION);
            break;
        case XTYP_EXECUTE :
            return DDE_FNOTPROCESSED;
        case XTYP_POKE :
            DdeGetData (hData, &Addr->HDBMS, sizeof(Addr->HDBMS), 0);
//            wsprintf (szTemp, "The server[1] received HDBMS = %x",Addr->HDBMS);
//            MessageBox (GetFocus (), szTemp, pStaticThis->Title, MB_ICONINFORMATION);
            pStaticThis->SendMsg ();
            return (HDDEDATA)DDE_FACK;
        case XTYP_REQUEST :
            if (pStaticThis->MatchTopicAndItem (1, hsz1, hsz2) == TRUE)
            {
                return pStaticThis->DataRequested (1, wFmt);
            }
            return NULL;
        case XTYP_WILDCONNECT :
            return pStaticThis->WildConnect (1, hsz1, hsz2, wFmt);
    default :
        break;
    }
    return NULL;
}

HDDEDATA FAR PASCAL _export DDESrvWindow::CallBack2 (WORD wType, WORD wFmt, HCONV hConv, HSZ hsz1, HSZ hsz2, HDDEDATA hData, DWORD, DWORD)
{
    switch (wType)
    {
        case XTYP_ADVREQ :
            if (pStaticThis->MatchTopicAndItem (2, hsz1, hsz2) == TRUE)
            {
                return pStaticThis->DataRequested (2, wFmt);
            }
            return NULL;
        case XTYP_ADVSTART :
            if ((pStaticThis->tfLoop[2] == FALSE) && (pStaticThis->MatchTopicAndItem (2, hsz1, hsz2) == TRUE))
            {
                pStaticThis->tfLoop[2] = TRUE;
        return (HDDEDATA)1;
            } else {
                return 0;
            }
        case XTYP_ADVSTOP :
            if ((pStaticThis->tfLoop[2] == TRUE) && (pStaticThis->MatchTopicAndItem (2, hsz1, hsz2) == TRUE))
            {
                pStaticThis->tfLoop[2] = FALSE;
            }
            break;
        case XTYP_CONNECT :
            if (pStaticThis->hConv[2] == 0)
            {
                if (pStaticThis->MatchTopicAndService (2, hsz1, hsz2) == TRUE)
                {
                    return (HDDEDATA)1;
                }
            }
            return 0;
        case XTYP_CONNECT_CONFIRM :
            pStaticThis->hConv[2] = hConv;
            break;
        case XTYP_DISCONNECT :
            if (hConv == pStaticThis->hConv[2])
            {
                pStaticThis->hConv[2] = 0;
                pStaticThis->tfLoop[2] = FALSE;
//                ExcelCount=0;
            }
            break;
        case XTYP_ERROR :
            wsprintf (szTemp, "The server[2] received : ");
            MessageBox (pStaticThis->HWindow, "A critical DDE error has occured.", pStaticThis->Title, MB_ICONINFORMATION);
            break;
        case XTYP_EXECUTE :
            return DDE_FNOTPROCESSED;
        case XTYP_POKE :
            DdeGetData (hData, &Addr->HTable, sizeof(Addr->HTable), 0);
			pStaticThis->SendMsg ();
            return (HDDEDATA)DDE_FACK;
        case XTYP_REQUEST :
//            MessageBox (0, "receive poke Message!","",MB_OK);
            if (pStaticThis->MatchTopicAndItem (2, hsz1, hsz2) == TRUE)
            {
                return pStaticThis->DataRequested (2, wFmt);
            }
            return NULL;
        case XTYP_WILDCONNECT :
            return pStaticThis->WildConnect (2, hsz1, hsz2, wFmt);
    default :
            break;
    }
    return NULL;
}

BOOL CheckHaveSoePrinter ()
{
	return Addr->scadainf.HaveSoePrint;
}
BOOL CheckRemote ()
{
	return Addr->scadainf.Remote;
}
BOOL CheckHaveTablePrinter ()
{
	return Addr->scadainf.TablePrint;
}
*/

⌨️ 快捷键说明

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