2016-11-23 6 views
2

Hier ist was los ist. Wenn ich versuche, eine AfxMessageBox aus meiner CDialog-Erweiterungsklasse auszuführen, erhalte ich einen Fehler (siehe unten). Ich habe das Internet gegoogelt, aber ich komme zu kurz. Dies ist der einzige Ort, an dem die Message-Box ausfällt, und ich weiß, dass der Rest des Codes funktioniert (ich bin durchgetreten).AfxMessageBox - Zugriffsverletzung

Kann jemand das beheben?

Vielen Dank im Voraus!

Fehlermeldung, wenn AfxMessageBox öffnet:

Unbehandelte Ausnahme bei 0x014b4b70 in IsoPro.exe: 0xC0000005: Zugriffsverletzung Leseort 0x34333345.

-Code AfxMessageBox zu starten, aus CDialog

LPTSTR temp; 
mainPassword.GetWindowText((LPTSTR)temp,100); 
CString cstr; 
cstr.Format("mainPassword = %s",temp); 
AfxMessageBox(cstr); 

-Code CDialog anzuzeigen:

CEnterpriseManagementDialog* emd = new CEnterpriseManagementDialog(); 
emd->Create(IDD_ENTERPRISE_MANAGEMENT_DIALOG); 
emd->ShowWindow(SW_SHOW); 
+0

Sie sollten [lesen Sie diese Antwort] (http://stackoverflow.com/questions/24472174/beginner-c-uninitialized-local- Variable/24472249 # 24472249), was das Problem ist in Bezug auf die verwendeten Zeiger. – PaulMcKenzie

+0

Sobald es ein CString wird, dachte ich, dass es dieses Objekt war und das war es. Wie liege ich falsch? Offensichtlich bin ich nur neugierig. –

+0

Es ist der Aufruf von GetWindowText, der in Frage steht, weit bevor die Zeile, die 'CString' verwendet, beteiligt ist. Sobald der fehlerhafte Aufruf von GetWindowText ausgeführt wird, hat die Beschädigung des Speichers bereits stattgefunden, – PaulMcKenzie

Antwort

3

Das Problem ist, wie Sie verwenden GetWindowText:

LPTSTR temp; 
mainPassword.GetWindowText((LPTSTR)temp,100); 

Sie lassen GetWindowText Versuch, einige nicht zugeordneten zu schreiben Speicher übergeben die nicht initialisierte temp Zeiger. Wenn Sie wirklich einen rohen Ausgangspuffer verwenden möchten, sollten Sie zuweisen Raum für sie vor einen Zeiger auf GetWindowText vorbei, zum Beispiel:

TCHAR temp[100]; 
mainPassword.GetWindowText(temp, _countof(temp)); 
// NOTE: No need to LPTSTR-cast 

Aber, da Sie C++ verwenden, können Sie wollen einfach verwenden, um eine Zeichenfolge Klasse wie CString, statt roher Puffer, zB:

CString password; 
mainPassword.GetWindowText(password); 

CString msg; 
msg.Format(_T("mainPassword = %s"), password.GetString()); 
// or you can just concatenate CStrings using operator+ ... 
AfxMessageBox(msg); 
+0

Brilliant. Vielen Dank! Dies sollte wirklich Teil der Spezifikation sein. –

+0

@DanG Es ist Teil der Spezifikation. Sie haben falsch verstanden, was es bedeutet, wenn eine Funktion einen Zeiger als Argument benötigt. Wenn Sie eine solche Deklaration sehen, bedeutet das nicht, dass Sie einen Zeiger deklarieren und an die Funktion übergeben. Die Funktion benötigt die * Adresse * eines vorhandenen Objekts. – PaulMcKenzie

+0

* "Schreib in ein unitärisiertes Gedächtnis" * - Es ist schlimmer, wirklich. Es wird durch einen nicht initialisierten Zeiger in einen zufälligen Speicher geschrieben. Das Schreiben in nicht initialisierten Speicher ist kein Problem für sich. – IInspectable

1

Es sieht aus wie die Variable Temp eine nicht initialisierte Zeiger (the definition of LPTSTR ist ein char *).

Versuchen Temp als Array definieren statt:

TCHAR temp[64]; 
+0

* "Die Definition von LPTSTR ist ein Zeichen *" * - Es ist nicht. [LPTSTR] (https://msdn.microsoft.com/en-us/library/windows/desktop/aa383751.aspx#LPTSTR) hängt vom 'UNICODE'-Präprozessorsymbol ab und es wird entweder zu einem' char * 'oder erweitert a 'wchar_t *'. Solange Sie keine Legacy-Software pflegen, sollte das 'UNICODE'-Präprozessorsymbol immer definiert sein. – IInspectable