C++/CLI EnumChildWindows funktioniert das so


#1

Hallo zusammen

Ich versuche alle Hwndl’s eines Frames Ausgeben zu lassen. leider habe ich aber den fehler

Es wurde versucht, im geschützten Speicher zu lesen oder zu schreiben. Dies ist häufig ein Hinweis darauf, dass anderer Speicher beschädigt ist.

Ich hoffe das es nur ein Fehler meiner Seits ist und nicht der Speicher Defekt ist.

Mein Code ist

System::Collections::Generic::List<IntPtr>^ Frameinformations::ChildHwndls(IntPtr hndl)
{
	this->frameHwndl = (HWND) hndl.ToPointer();
	
	System::Collections::Generic::List<IntPtr>^ result = gcnew System::Collections::Generic::List<IntPtr>();
	std::vector<HWND> myHwndl;
	WNDENUMPROC proc;

	EnumChildWindows(this->frameHwndl, proc, (LPARAM)(&myHwndl));

	for each (HWND var in myHwndl)
	{
		result->Add((IntPtr)var);
	}

	return result;
	
}

#2

es ist Dein Fehler ^^ - der Speicher kann zwar defekt sein, aber darum kümmert sich die Hardware (in dem Fall der Speicherriegel selber)

Mir schwirrt da jetzt was wie “das Objekt pinnen” im Kopf rum. Ich weis nicht ob da .NET es an der Stellen (in dem es den Pointer erzeugt) automatisch macht. Der GC kann bei der nächsten Zeile das Objekt schon iweder woanders hin verschoben haben. Dein Pointer zeigt aber noch auf den alten Speicherbereich.

Das ist aus der Standart-Library. Wenn Du direkt .NET startest wird die aber nicht initialisiert - wie das geht habe ich nie raus bekommen. Meine letzten Versuche an der Stellen waren noch .NET 1.1.

Außerdem die wichtigste Frage - an welcher Stelle bricht er den ab? Schon mit dem Debugger Zeile für Zeile durch gelaufen :slight_smile:

das sieht auch komisch aus - Du machst hier aus einem HWND ein IntPtr - das sind zwei verschiedene Dinge (ich will jetzt aber darüber auch nicht weiter nach denken)

hand, mogel


#3

Danke mogel für deine Schnelle Antwort, ich habe den fehler gefungen und es erst mal zum testen in ner Win32 Konsolen Anwendung versucht. Es fehlt die Callback methode.

#include "stdafx.h"


int _tmain(int argc, _TCHAR* argv[])
{
	HWND desktop = GetDesktopWindow();
	EnumChildWindows(desktop, hdls, 0);
	int wait;

	std::cout << "es werde die Desktop Childs Ausgegeben" << std::endl;

	std::cin >> wait;
	
	
	
	return 0;
}


BOOL CALLBACK hdls(HWND hwnd, LPARAM lParam)
{
	std::cout << hwnd << std::endl;
	return TRUE;
}

nur kommt nun der Fehler

Fehler 1 error C2065: ‘hdls’: nichtdeklarierter Bezeichner


#4

C bzw C++ ist da etwas anders als Java

Dort wo Du die Funktion verwendest (EnumChildWindows) ist die Funktion noch unbekannt. Tausche mal einfach beide Funktionen in der Reihenfolge in der CPP


#5

Hallo Andy16823,

füge eine Funktionsdeklaration vor “_tmain” ein:

#include "stdafx.h"
 
BOOL CALLBACK hdls(HWND hwnd, LPARAM lParam);
 
int _tmain(int argc, _TCHAR* argv[])
{

...

Gruß
albatros