Avatar billede jannikmunk Nybegynder
13. september 2004 - 15:33 Der er 2 kommentarer og
2 løsninger

Unhandled exception in abc.exe (MFC42.DLL):0xC.. Access Violation

I Microsoft Visual C++ (Version 6.0), har jeg følgende kodeblok:

>>>>>>>>>>>>>>>

void Connection::WaitPassword()
{
  CString deb;
  if (m_bTimeout) {
    if (OkToRetry()) {
      SendPassword();
    }
    else {
      m_eInState = i_S_CLOSE_CALL;
      m_pDBGeneral->Log(m_strT_ID, 615, "COM port "+CString(CICString(m_nComPortNo))+" State: "+CString(CICString(m_eInState)), "system");
    }
  }
  tagDataResult messageResult=IsMessageComplete(*m_pInBuffer);
  if (messageResult==data_OK) {
    BYTE ans=(*m_pInBuffer)[5];
    switch (ans) {
      case 0x03: // Password accepted
        {
          CString MSID=CString((char*)m_pInBuffer->GetData()+6,6);
          deb.Format("MSID = %s",MSID);
          debug(deb);

          // Opret DbConnection link
          if (m_pDBConn==NULL) {
            debug("Creating DBConnection.");
            m_pDBConn = new DBConnection;
            int res = m_pDBConn->Open(m_strT_ID,m_strLogin,m_strPassword);
            if (res==0) {
              debug("Error connecting to database");
            }
          }
          else {
            debug("Connection not NULL. Destroying and creating new.");
            m_pDBConn->Close();
            delete m_pDBConn;
            m_pDBConn = new DBConnection;
            m_pDBConn->Open(m_strT_ID,m_strLogin,m_strPassword);
          }

          m_pDBGeneral->GetControlData(m_strT_ID,m_ControlData);
          // Check Device_type
          int Device_type = m_pDBGeneral->GetDeviceType(m_strT_ID, m_strTlfReserved, m_nMakroNo);
          deb.Format("Device type = %d",Device_type);
          debug(deb);

          *m_pInBuffer = CSArray();
          m_eInState = i_S_GET_DATA_FROM_TIME;
        }
        break;

      case 0x04:    // Det modtagne password eksisterer ikke
        {
          deb.Format("%s",m_pInBuffer->gethex());
          debug(deb);
          debug("Password dont exist");

          // Log an error to log
          m_pDBGeneral->Log(m_strT_ID, 631, "Password dont exist", "system");

          *m_pInBuffer = CSArray();
          m_eInState = i_S_END_SESSION;
        }
        break;
      case 0x05:    // Det modtagne password ved login, giver ikke ret til at udføre den ønskede kommando.
        {
          deb.Format("%s",m_pInBuffer->gethex());
          debug(deb);
          debug("Insufficient access to set time");

          // Log an error to log
          m_pDBGeneral->Log(m_strT_ID, 632, "Password: Insufficient access to set time", "system");

          *m_pInBuffer = CSArray();
          m_eInState = i_S_ END_SESSION;
        }
        break;

      case 0x02: // Command not understood
        {
          if (OkToRetry()) {
            *m_pInBuffer = CSArray();
            SendPassword();
          }
          else {
            *m_pInBuffer = CSArray();
            m_eInState = i_S_CLOSE_CALL;
          }
        }
        break;
      default:
        {
          deb.Format("%s",m_pInBuffer->gethex());
          debug(deb);
          deb.Format(" Resp not understood %d. Exp [03] or [04] or [02]",ans);
          debug(deb);
          *m_pInBuffer = CSArray();
          m_eInState = i_S_CLOSE_CALL;
        }
        break;
    }
  }
  if (messageResult==data_CRCError) {
    if (OkToRetry()) {
      SendRepeat();
      *m_pInBuffer = CSArray();
    }
    else {
      *m_pInBuffer = CSArray();
      m_eInState = i_S_CLOSE_CALL;
    }
  }

}
<<<<<<<<<<<<<<<<<

Hvis det modtagne password IKKE eksisterer kører mit program lidt videre herfra, men dør med fejlen: "Unhandled exception in abc.exe (MFC42.DLL):0xC0000005 Access Violation" i en ef de efterfølgende kodeblokke.

Hvis det modtagne password eksisterer kører programmet fint videre herfra, i nøjagtigt de samme kodeblokke.

Hvad kan jeg gøre for at finde fejlen og rette den, eller håndterer den fejl der opstår ?

Venlig hilsen og på forhånd tak for hjælpen
Jannik
Avatar billede bertelbrander Novice
13. september 2004 - 19:36 #1
Jeg tror at fejlen er her:
*m_pInBuffer = CSArray();

Lav det om til:
*pInBuffer = new CSArray;
Avatar billede jannikmunk Nybegynder
14. september 2004 - 10:42 #2
Kompileren syntes ikke om dit forslag !

C:\....\ConnectionList.cpp(8206) : error C2679: binary '=' : no operator defined which takes a right-hand operand of type 'class CSArray *' (or there is no acceptable conversion)
Avatar billede bertelbrander Novice
14. september 2004 - 19:20 #3
Der er vist en * for meget i den linie, det bør vist være:

pInBuffer = new CSArray;

Jeg er dog ikke sikker på at det er hele problemet.
Avatar billede jannikmunk Nybegynder
18. september 2004 - 08:52 #4
Jeg har selv fundet fejlen !

Hvis mit opkald går godt opretter jeg en databaseforbindelse, hvis det går skidt opretter jeg ikke en databaseforbindelse. Når jeg så efterfølgende afslutter på samme måde, så nedlægger jeg jo en forbindelse for meget.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester