Jump to content
dragontechi

Access Violation

Recommended Posts

ddddddddd

 

BOOL CLoginScene::_InitUI() {
    frmPathLogo = CFormMgr::s_Mgr.Find("frmPathLogo");
    if (!frmPathLogo) return false;
    frmPathLogo->SetIsShow(false);

    frmAccount = CFormMgr::s_Mgr.Find("frmAccount");
    if (!frmAccount) return false;
    frmAccount->SetIsShow(false);
    frmAccount->evtEntrustMouseEvent = _evtLoginFrm;

    chkID = (CCheckBox *)frmAccount->Find("chkID");
    m_bSaveAccount = false;
    if (!chkID) return false;

    char szChkID[128] = {0};
    string strChkID;
    ifstream inCheck("user\\SavedAccounts\\checkid.dat");
    if (inCheck.is_open()) {
        while (!inCheck.eof()) {
            inCheck.getline(szChkID, 128);
            strChkID = szChkID;
            int nCheck = Str2Int(strChkID);
            m_bSaveAccount = (nCheck == 1) ? true : false;
            chkID->SetIsChecked(m_bSaveAccount);
        }
    } else {
        // Si el archivo no existe, establecer el estado del checkbox en false
        m_bSaveAccount = false;
        chkID->SetIsChecked(m_bSaveAccount);
    }

    edtID = dynamic_cast<CEdit*>(frmAccount->Find("edtID"));
    if (!edtID) return false;
    m_sSaveAccount = "";

    ifstream in("user\\SavedAccounts\\accounts.dat");
    if (in.is_open()) {
        string line;
        getline(in, line);
        istringstream iss(line);
        getline(iss, m_sSaveAccount, ':');
        edtID->SetCaption(m_sSaveAccount.c_str());
        edtID->evtEnter = _evtEnter;
        edtID->SetIsWrap(true);
        in.close();
    } else {
        // Manejar caso en el que no se puede leer el archivo de cuenta
        ofstream outUsername("user\\SavedAccounts\\accounts.dat");
        if (outUsername.is_open()) {
            outUsername << "";
            outUsername.close();
        }
    }

// Leer la cuenta y la contraseña encriptada desde el archivo
ifstream inAccounts("user\\SavedAccounts\\accounts.dat");
if (inAccounts.is_open()) {
    string line;
    getline(inAccounts, line);

    // Dividir la línea en la cuenta y la contraseña encriptada
    size_t pos = line.find(":");
    if (pos != string::npos) {
        string username = line.substr(0, pos);
        string encryptedPassword = line.substr(pos + 1);

        // Desencriptar la contraseña
        string key = "myencryptionkey";  // Cambia esta clave por tu clave de cifrado
        string decryptedPassword = EncryptionUtils::EncryptDecrypt(encryptedPassword, key);

        // Configurar la interfaz de usuario con la cuenta y la contraseña desencriptada
        edtID = dynamic_cast<CEdit*>(frmAccount->Find("edtID"));
        if (edtID) {
            edtID->SetCaption(username.c_str());
            edtID->evtEnter = _evtEnter;
            edtID->SetIsWrap(true);
        }

        edtPassword = dynamic_cast<CEdit*>(frmAccount->Find("edtPassword"));
        if (edtPassword) {
            edtPassword->SetIsPassWord(false);
            edtPassword->SetIsWrap(true);
            edtPassword->evtEnter = _evtEnter;
            m_sPassword = decryptedPassword;
            edtPassword->SetCaption(m_sPassword.c_str());
        }
    }

    inAccounts.close();
}



    //Agregar la interfaz del teclado virtual
    frmKeyboard = CFormMgr::s_Mgr.Find("frmKeyboard");
    if (!frmKeyboard) return false;
    frmKeyboard->Hide();

    chkShift = (CCheckBox*)frmKeyboard->Find("chkShift");
    if (!chkShift) return false;

    //Configurar el manejo de eventos de clic del ratón en la interfaz del teclado virtual
    frmKeyboard->evtEntrustMouseEvent = _evtKeyboardFromMouseEvent;

    edtID->evtActive = _evtAccountFocus;
    edtPassword->evtActive = _evtAccountFocus;

    imgLogo1 = (CImage*)frmAccount->Find("imgLogo1");
    if (!imgLogo1) return false;

    imgLogo2 = (CImage*)frmAccount->Find("imgLogo2");
    if (!imgLogo2) return false;

    return TRUE;
}

tengo un problema al tratar de buscar     size_t pos = line.find(":"); 

me da error 
Access Violation
The thread attempted to read from or write to a virtual address for which it does not have the appropriate access
c:\users\techi\desktop\client source vs 2003\client\client\src\loginscene.cpp(1063) : Game.exe at CLoginScene::_InitUI()

// Leer la cuenta y la contraseña encriptada desde el archivo
ifstream inAccounts("user\\SavedAccounts\\accounts.dat");
if (inAccounts.is_open()) {
    string line;
    getline(inAccounts, line);

    // Dividir la línea en la cuenta y la contraseña encriptada
    size_t pos = line.find(":");
    if (pos != string::npos) {
        string username = line.substr(0, pos);
        string encryptedPassword = line.substr(pos + 1);

        // Desencriptar la contraseña
        string key = "myencryptionkey";  // Cambia esta clave por tu clave de cifrado
        string decryptedPassword = EncryptionUtils::EncryptDecrypt(encryptedPassword, key);

        // Configurar la interfaz de usuario con la cuenta y la contraseña desencriptada
        edtID = dynamic_cast<CEdit*>(frmAccount->Find("edtID"));
        if (edtID) {
            edtID->SetCaption(username.c_str());
            edtID->evtEnter = _evtEnter;
            edtID->SetIsWrap(true);
        }

        edtPassword = dynamic_cast<CEdit*>(frmAccount->Find("edtPassword"));
        if (edtPassword) {
            edtPassword->SetIsPassWord(false);
            edtPassword->SetIsWrap(true);
            edtPassword->evtEnter = _evtEnter;
            m_sPassword = decryptedPassword;
            edtPassword->SetCaption(m_sPassword.c_str());
        }
    }

    inAccounts.close();
}
esto ocurre cuando accounts.dat esta en blanco

 

 

Share this post


Link to post
Share on other sites

(sry I don't speak spanish) Error happens because line.find(":") is trying to access "line", which is empty when the file is empty, because there are 0 lines in the file. You can try this:

while(getline(inAccounts, line)) {
    codethatuseslinecontent(&line);
}

"While" will work until getline doesn't return anything (when there are no lines left).

  • Like 1

Share this post


Link to post
Share on other sites

I translate.... , el error pasa porque line.find(":")  esta intentando acceder a  line"/lineas en la que esta vacia ,cuando el archivo esta vacio , por eso ahi 0 lines"/lineas en el archivo 

Puedes intentatr esto tambien 

 

while(getline(inAccounts, line))

{ codethatuseslinecontent(&line); }

 

"While" funcionará hasta que getline no devuelva nada (cuando no queden líneas"lines").

 

Espero que haya servido...

  • Like 1

Share this post


Link to post
Share on other sites

@dragontechi

std::ifstream inAccounts("user\\SavedAccounts\\accounts.dat");

if (inAccounts.is_open()) {

    std::string line;
    std::getline(inAccounts, line);
   
    if (!line.empty())
    {

        std::size_t pos = line.find_first_of(":");
        if (pos != std::string::npos)
        {

            //...

        }

    }

    inAccounts.close();

}

 

Edited by BXlevovich
  • Like 1

Share this post


Link to post
Share on other sites
BOOL CLoginScene::_InitUI() {
    // Encontrar el formulario de la ruta del logo y ocultarlo si existe
    frmPathLogo = CFormMgr::s_Mgr.Find("frmPathLogo");
    if (!frmPathLogo) return false;
    frmPathLogo->SetIsShow(false);

    // Encontrar el formulario de la cuenta y ocultarlo si existe, también asignar el manejador de eventos
    frmAccount = CFormMgr::s_Mgr.Find("frmAccount");
    if (!frmAccount) return false;
    frmAccount->SetIsShow(false);
    frmAccount->evtEntrustMouseEvent = _evtLoginFrm;

    // Encontrar el checkbox de guardar cuenta y configurar su estado
    chkID = dynamic_cast<CCheckBox*>(frmAccount->Find("chkID"));
    m_bSaveAccount = false;
    if (chkID) {
        ifstream inCheck("user\\SavedAccounts\\checkid.dat");
        if (inCheck.is_open()) {
            char szChkID[128] = { 0 };
            while (inCheck.getline(szChkID, 128)) {
                m_bSaveAccount = (Str2Int(szChkID) == 1);
                chkID->SetIsChecked(m_bSaveAccount);
            }
        } else {
            m_bSaveAccount = false;
            chkID->SetIsChecked(m_bSaveAccount);
        }
    }

    // Encontrar los campos de ID y contraseña y salir si alguno de ellos no existe
    edtID = dynamic_cast<CEdit*>(frmAccount->Find("edtID"));
    edtPassword = dynamic_cast<CEdit*>(frmAccount->Find("edtPassword"));
    if (!edtID || !edtPassword) return false;

    // Inicializar la cadena de la cuenta guardada
    m_sSaveAccount = "";

    // Leer la cuenta guardada desde el archivo
    ifstream in("user\\SavedAccounts\\accounts.dat");
    if (in.is_open()) {
        string line;
        if (getline(in, line)) {
            // Extraer la cuenta guardada y configurar el campo de ID si existe
            istringstream iss(line);
            getline(iss, m_sSaveAccount, ':');
            if (edtID) {
                edtID->SetCaption(m_sSaveAccount.c_str());
                edtID->evtEnter = _evtEnter;
                edtID->SetIsWrap(true);
            }

            // Configurar el campo de contraseña si existe
            if (edtPassword) {
                size_t pos = line.find_first_of(":");
                if (pos != string::npos) {
                    string encryptedPassword = line.substr(pos + 1);
                    string key = "myencryptionkey";
                    string decryptedPassword = EncryptionUtils::EncryptDecrypt(encryptedPassword, key);

                    edtPassword->SetIsPassWord(false);
                    edtPassword->SetIsWrap(true);
                    edtPassword->evtEnter = _evtEnter;
                    m_sPassword = decryptedPassword;
                    edtPassword->SetCaption(m_sPassword.c_str());
                }
            }
        }
        in.close();
    } else {
        // Manejar caso en el que no se puede leer el archivo de cuenta
        ofstream outUsername("user\\SavedAccounts\\accounts.dat");
        if (outUsername.is_open()) {
            outUsername << "";
            outUsername.close();
        }
    }

    // Encontrar el formulario del teclado virtual y ocultarlo si existe
    frmKeyboard = CFormMgr::s_Mgr.Find("frmKeyboard");
    if (!frmKeyboard) return false;
    frmKeyboard->Hide();

    // Encontrar el checkbox de cambio de mayúsculas del teclado virtual
    CCheckBox* chkShift = dynamic_cast<CCheckBox*>(frmKeyboard->Find("chkShift"));
    if (!chkShift) return false;

    // Configurar el manejador de eventos de clic del ratón en el teclado virtual
    frmKeyboard->evtEntrustMouseEvent = _evtKeyboardFromMouseEvent;

    // Configurar los manejadores de eventos de activación para los campos de ID y contraseña
    if (edtID) edtID->evtActive = _evtAccountFocus;
    if (edtPassword) edtPassword->evtActive = _evtAccountFocus;

    // Encontrar las imágenes de logotipo en el formulario de la cuenta
    imgLogo1 = dynamic_cast<CImage*>(frmAccount->Find("imgLogo1"));
    imgLogo2 = dynamic_cast<CImage*>(frmAccount->Find("imgLogo2"));

    return true;
}

Quiero agradecer a todos por su ayuda. Gracias a sus sugerencias y colaboración, pude resolver el problema simplificando y eliminando partes innecesarias del código. La optimización ha mejorado significativamente la legibilidad y eficiencia de la implementación. Estoy muy agradecido por su apoyo y orientación. ¡Muchas gracias de nuevo a todos!

I want to thank everyone for their help. Thanks to your suggestions and collaboration, I was able to solve the problem by simplifying and removing unnecessary parts of the code. The optimization has significantly improved the readability and efficiency of the implementation. I am very grateful for your support and guidance. Thanks again to all!

  • Like 1

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...