Programmabsturz
-
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 iconCenterWindow(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"