Newbie Problem!
-
Wie kann ich auf die Variable strClassName zugreifen ohne folgende Fehler zu erzeugen. "Der Vorgang "written" konnte nicht auf dem Speicher durchgeführt werden".
GetClassName(const CAId& classId, CString& strClassName);
Ich habe bis jetzt immer so gemacht:
CString className;
ca.GetClassName(classId, className);bekomme aber tausende Fehler bei der Ausfführung.
Danke!
-
Die Klassennamen verleiten mich zu der Annahme, dass du MFC verwendest (Microsoft Visual C++). Ist dem so?
Ansonsten ist der Grund für die Fehlermeldungen entweder bei der Implementation von CString oder bei der Implementation von GetClassName.
Wie auch immer, auf jedenfall brauchen wir mehr Informationen.
-
Ich versuche einfach anhand der Id Nummer einer Klasse, den Klassennamen zu ermitteln und es auszugeben
.
Wie GetClassName() genau funktionniert kann ich nicht genau sagen, dass ist eine Schnittstellen-Methode. Den Quellcode habe ich nicht zur Verfügung.if (numberOfClasses > 0) { int j = 0; while(++j < numberOfClasses) { CAId classId = Classes.GetAt(j); cout << "Id der Klasse = " << classId << endl; CString className; cout << "GetClassName FPResultCode = " << ca.GetClassName(classId, className) << endl; int k = -1; while(++k < strClassName.GetLength()); cout << strClassName.GetAt(k); cout << endl; } }Ich habe jedesmal das gleiche Problem wenn ich eine Methode aufrufen muss wo einer der Parameter vom Typ &CString ist.
Zum Beispiel:
CString activeLanguage; cout << ca.GetActiveLanguage (activeLanguage) <<endl;usw.
Hier sind nochmal die ganzen Fehlermeldungen die ich bekomme:
Die Anweisung in "0x778cce36 verweist auf Speicher in "0x74506f54". Der Vorgang "written konnte nicht auf dem Speicher durchgeführt werden.
File dbgheap.c
Line 1011
_CrtIsValidHeapPointer(pUserData)Line 1017
BlOCK_TYPE_IS_VALID(pHeap->nBlockUse)Debug Error.
Damage before block #524544 at 0x007A39DCDie Anweisung in "0x6c37190a" verweist auf Speicher in "0xdddddddd". Der Vorgang "read" konnte nicht auf dem Speicher durchgeführt werden
pHead->nBlockUse==nBlockUsepLastBlock = pHead
pFirstBlock = pHead
Hilft es denn weiter?
Und ja ich benutze MFC.
-
Dann wissen die Leute aus dem MFC Forum sicher mehr darüber

-
Hast du schon einen Debug gemacht ob er auch wirklich beim CString abstürzt.
Schau mal in die Klasse und Methode ca.GetActiveLanguage
-
Bei mir kam der Fehler, weil ich einen Pointer auf eine Variable hatte, dessen Klasse schon wieder zerstört wurde.
Kann es sein, daß eine deiner Klassen garnicht mehr (oder noch nicht) Instanziiert wurde? Von Welcher Klasse ist den "ca" in deinem unteren Beispiel?
-
Was GetActiveLanguage genau macht, kann ich nicht sagen, es ist wie gesagt ein fertiges Programm auf dem ich nur über Schnittstelle zugreifen kann, und ich habe den Quelltext nicht.
ca ist eine Instanz der externe Schnittstelle um auf dieses Programm zuzugreifen. Die stellt einfach Methode zu Verfügung mit dem ich ein paar Informationen und Werte abfragen kann.Alle Probleme tauchen aber immer im Zusammenhang mit CString.
Zum Beispiel, habe ich nur ein paar printf Befehle. Dann wenn ich zum Beispiel folgendes aufrufe,CAValue *value = NULL; bool caConst; cout << ca.GetValue(InstId,AttrId, value, caConst) << endl; rpValue -> AsString();hackts es genau an diese Stelle
value -> AsString();also weiss ich gar nicht ob ich das Problem überhaupt lösen kann. Meine Anwendung crasht zwar nicht, aber die Fehrlermeldungen sind trotzdem nervig, und ich muss mich durch ignorieren durchklicken.
Das sind die ganzen Meldungen aus dem Debugger, an den ich leider nicht so viel verstehe.
NTDLL! 778a018c()
NTDLL! 778b6454()
NTDLL! 7789260c()
KERNEL32! 77e81495()
_CrtIsValidHeapPointer(const void * 0x007a5424) line 1606
_free_dbg_lk(void * 0x007a5424, int 1) line 1011 + 9 bytes
_free_dbg(void * 0x007a5424, int 1) line 970 + 13 bytes
operator delete(void * 0x007a5424) line 351 + 12 bytes
CString::FreeData() line 146 + 15 bytes
CString::~CString() line 213
main(int 1, char * * 0x00851fb0, char * * 0x00850e80) line 257
mainCRTStartup() line 338 + 17 bytes
KERNEL32! 77e87d08()pUserData 0x007a5424
nBlockUse 1
pHead 0x007a5404memory check error at 0x007A5420 = 0x00, should be 0xFD.
memory check error at 0x007A5421 = 0x00, should be 0xFD.
memory check error at 0x007A5422 = 0x00, should be 0xFD.
memory check error at 0x007A5423 = 0x00, should be 0xFD.
memory check error at 0x007A5424 = 0x00, should be 0xFD.
memory check error at 0x007A5425 = 0x00, should be 0xFD.
memory check error at 0x007A5426 = 0x00, should be 0xFD.
memory check error at 0x007A5427 = 0x00, should be 0xFD.
-
Oder gibt es zumindest die Möglichkeit so einen Fehler abzufangen?