Programmabsturz



  • Hallo zusammen

    habe ein Problem mit folgender Codezeile:
    MessageBox(_T("hallo_1"));
    (VS_FIXEDFILEINFO)this = (VS_FIXEDFILEINFO)lpvi;
    MessageBox(_T("hallo_2"));

    hallo_1 wird ausgegeben hallo_2 nicht mehr. Das Programm beendet sich selbst!

    Hat jemand einen Tipp woran es liegen könnte?

    Mit freundlichem Gruss
    Rolf_VIII

    ---------------------------
    Betriebsystem: XP
    Entw.System: eMbedded3.0



  • So lüppt et einwandfrei:

    MessageBox(_T("hallo_1"));
    MessageBox(_T("hallo_2"));
    


  • Es liegt an der Zeile

    *(VS_FIXEDFILEINFO*)this = *(VS_FIXEDFILEINFO*)lpvi;
    

    Mach den Fehler raus, dann sollte es wieder laufen.



  • hi all

    Ihr seit ja Helden...
    Das ist mir auch klar smile. Aber die Zeile muss da sein. Die MessageBox sind nur um verifizieren, ob wirklich da der Fehler auftritt. Die werden wieder gelöscht.



  • *(VS_FIXEDFILEINFO*)this
    

    da liegt der fehler, sofern this nicht von VS_FIXEDFILEINFO abgeleitet ist.



  • Rolf_VIII schrieb:

    MessageBox(_T("hallo_1"));
    *(VS_FIXEDFILEINFO*)this = *(VS_FIXEDFILEINFO*)lpvi;
    MessageBox(_T("hallo_2"));
    

    machst du debugging immer so?

    Greetz, Swordfish



  • Hi Swordfish
    nein, eigentlich nicht. Aber mit meinem eMbedded3.0 kann ich nicht debuggen. Habe schon zig Studen damit verbracht, den Emulator zum laufen zu brigen ... geht nicht geschweige auf dem PDA direkt zu testen. So teste ich halt so, etwas mühsam.....
    -------------------
    otze:
    das verstehe ich nicht.
    der selbe Code läuft unter VS6.0 einwandfrei. Nur eMbedded3.0 hat damit ein Problem, das ich nicht verstehe....

    Rolf_VIII



  • gib uns mehr code.



  • *(VS_FIXEDFILEINFO*)this = *(VS_FIXEDFILEINFO*)lpvi;
    

    Wie wäre es, wenn du den this-Zeiger nicht überschreibst und eine extra Variable für lpvi anlegst?

    VS_FIXEDFILEINFO* FFinfo = (VS_FIXEDFILEINFO*)lpvi;
    

    Wenn der Code in einem Copy'tor steht, dann kannst du den Passenden Parameter gleich als VS_FIXEDFILEINFO* entgegennehmen und musst den cast nicht machen.



  • hier ist die ganze Funktion:
    PS: wie krieg ich den Code in ein eigennen Editor (Fenster)?

    /////////////////////////////////////////////////////////////////////////////
    // CBVNummerDlg message handlers
    BOOL CBVNummerDlg::OnInitDialog()
    {
    CDialog::OnInitDialog();

    // Set the icon for this dialog. The framework does this automatically
    // when the application's main window is not a dialog
    SetIcon(m_hIcon, TRUE); // Set big icon
    SetIcon(m_hIcon, FALSE); // Set small icon

    CenterWindow(GetDesktopWindow()); // center to the hpc screen

    // TODO: Add extra initialization here
    CString ver = "abcdefg";
    CString modulename = "BVNummer.exe";

    struct TRANSLATION {
    WORD langID; // language ID
    WORD charset; // character set (code page)
    } m_translation;

    m_translation.charset = 1252; // default = ANSI code page
    memset((VS_FIXEDFILEINFO*)this, 0, sizeof(VS_FIXEDFILEINFO));

    //get path and file name of my self exe
    TCHAR fullFilename[100]; //Versuch 1
    ::GetModuleFileName(NULL, fullFilename, 100);
    //AfxMessageBox( fullFilename );//Testausgabe
    //////////
    //Fehlermeldung handling with MessageBox for 'get path and file name'
    const unsigned long fehler = GetLastError();
    CMyString myString;
    CString str = myString.toString(fehler);
    str.Format(_T("%i\n"), fehler );
    //MessageBox(str);Testausgabe
    //Fehlermeldung output for error message and error number
    if (!fehler)
    { MessageBox(_T("ich befinde mich jetzt hier...")); Output(CWin32Error()); return -1; }
    //else { MessageBox(_T("kein Fehler")); }

    // read file version info
    DWORD dwLen = GetFileVersionInfoSize(fullFilename, NULL);
    if (dwLen <= 0)
    {
    MessageBox(_T("ERROR-1 'GetFileVersionInfoSize'"));
    return FALSE;
    }
    //else { MessageBox(_T("kein Fehler bei 'GetFileVersionInfoSize'-1")); }

    // read file version info
    TCHAR *filename = fullFilename ;
    DWORD dwDummyHandle; // will always be set to zero
    dwLen = GetFileVersionInfoSize(filename, &dwDummyHandle);
    if (dwLen <= 0)
    {
    MessageBox(_T("ERROR-2 'GetFileVersionInfoSize'"));
    return FALSE;
    }
    //else { MessageBox(_T("kein Fehler bei 'GetFileVersionInfoSize'-2")); }

    filename = _T("BVNummer.exe");
    BYTE* lpData = new BYTE[dwLen]; // allocate version info
    //delete [] lpData;
    //if (!::GetFileVersionInfo( fullFilename, 0, dwLen, lpData ) );
    /* //Testausgabe von Parameter 1
    CString Titel1 = "Parameter 1";
    MessageBox(fullFilename, Titel1); //->io
    //Testausgabe von Parameter 2
    CString Titel2 = "Parameter 2";
    CString mystrp2;
    mystrp2.Format(_T("%i"), dwLen);
    MessageBox(mystrp2, Titel2); //->io => "868"
    //Testausgabe von Parameter 3
    CString Titel3 = "Parameter 3";
    CString mystrp3;
    mystrp3.Format(_T("%i"), *lpData);
    mystrp3 = _T("'") + mystrp3 + _T("'");
    MessageBox(mystrp3, Titel3);
    */ ////
    if (!::GetFileVersionInfo( fullFilename, 0, dwLen, lpData ) )
    {
    MessageBox(_T("ERROR 'GetFileVersionInfo'"));
    return FALSE;
    }
    //else { MessageBox(_T("kein Fehler bei 'GetFileVersionInfo'")); }

    LPVOID lpvi;
    UINT iLen;
    if (!VerQueryValue(lpData, _T("\"), &lpvi, &iLen) )
    {
    MessageBox(_T("ERROR 'VerQueryValue'-1"));
    return FALSE;
    }
    //else { MessageBox(_T("kein Fehler bei 'VerQueryValue'-1")); }
    /*
    CMyString mystr;
    CString strTemp1, strTemp2;
    strTemp1 = mystr.toString(*lpData);
    strTemp1 = _T("<") + strTemp1 + _T(">");
    strTemp2.Format(_T("%i"), *lpData);
    strTemp2 = _T("'") + strTemp2 + _T("'");
    MessageBox(strTemp2);
    */

    MessageBox(_T("hallo_1"));
    // copy fixed info to myself, which am derived from VS_FIXEDFILEINFO
    (VS_FIXEDFILEINFO)this = (VS_FIXEDFILEINFO)lpvi; //---> Absturz
    MessageBox(_T("hallo_2"));//wird nicht mehr angezeigt, Progr. wurde beendet!

    // Get translation info
    if (VerQueryValue(lpData, _T("\\VarFileInfo\\Translation"), &lpvi, &iLen) && iLen >= 4)
    {
    MessageBox(_T("kein Fehler bei 'VerQueryValue'-2"));
    m_translation = (TRANSLATION)lpvi;
    }
    else { MessageBox(_T("ERROR 'VerQueryValue'-2")); }

    dwSignature == VS_FFI_SIGNATURE;

    CString lpKeyName = modulename;
    CString sVal = "leer";
    CString query;
    query.Format(_T("\\StringFileInfo\%04x%04x\%s"),
    m_translation.langID,
    m_translation.charset,
    lpKeyName);

    LPCTSTR pVal;
    UINT iLenVal;
    if (VerQueryValue(lpData, (LPTSTR)(LPCTSTR)query, (LPVOID*)&pVal, &iLenVal))
    {
    sVal = pVal;
    }
    MessageBox( sVal ); // hier sollte meine gewünschte Information stehen!



  • this zeigt also auf einen Dialog. Also macht die Zeile keinen Sinn.



  • Bitte schließe deinen Code in CPP-tags ein (siehe C/C++ Button links unter den Smileys).



  • Chris
    ich hab zwar nicht ganz verstanden was ich gemacht habe und was ich jetzt geändert habe aber es funtioniert jetzt ohne Fehler ....

    bis am Schluss.
    Codebeispiel:

    if (VerQueryValue(lpData, (LPTSTR)(LPCTSTR)query, (LPVOID*)&pVal, &iLenVal)) 
    {
       MessageBox(_T("kein Fehler bei 'VerQueryValue'-3"));
       sVal = pVal;
    }
    else { MessageBox(_T("ERROR 'VerQueryValue'-3")); }
    
    MessageBox( sVal );
    

    Dieser letzte Abschnitt gibt noch nicht das zurück was ich möchte. Ich nehme aber an, dass der Fehler weiter oben zu sichen ist. Ev. beim "CString query"


Anmelden zum Antworten