Fehler bei EnumChildWindows

  • C++

Es gibt 21 Antworten in diesem Thema. Der letzte Beitrag () ist von Marcus Gräfe.

    Fehler bei EnumChildWindows

    Halo, ich versuche mir die Child Windows Ausgeben zu lassen, nur kommt dann

    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.


    Mein code ist

    C-Quellcode

    1. System::Collections::Generic::List<IntPtr>^ Frameinformations::ChildHwndls(IntPtr hndl)
    2. {
    3. this->frameHwndl = (HWND) hndl.ToPointer();
    4. System::Collections::Generic::List<IntPtr>^ result = gcnew System::Collections::Generic::List<IntPtr>();
    5. std::vector<HWND> myHwndl;
    6. WNDENUMPROC proc;
    7. EnumChildWindows(this->frameHwndl, proc, (LPARAM)(&myHwndl));
    8. for each (HWND var in myHwndl)
    9. {
    10. result->Add((IntPtr)var);
    11. }
    12. return result;
    13. }
    Meine Projekte Genesis Game Engine | GFX | smartli.me - Der smarte URL shortener

    Was zur Hölle soll das denn werden ? Du packst da n vector<> in eine C-Windows-API ?(
    Abgesehen davon castet man in C++ nicht mit (Typ) sondern mit dynamic_cast<>, static_cast<>, const_cast<> und für so C Sachen reinterpret_cast<>. Guck mal auf MSDN nach EnumChildWindows und im IntelliSense was denn überhaupt n WNDENUMPROC ist.
    EnumChildWindows da habe ich einen Beitrag von @hal2000: einen Beitrag gelesen wo er Erklärt hat wie die Funktion Abläuft.

    hal2000 schrieb:

    Der ganze Ablauf nochmal kurz:
    -EnumChildWindows() nimmt ein Handle entgegen, das das Elternfenster angibt.
    -Weitere Werte sind eine Callback-Adresse (Enum()) und ein Objekt.
    -EnumChildWindow() übergibt das erste Kindfenster-Handle an die Enum-Funktion, welche dieses verarbeitet.
    -Gibt Enum() True zurück, wird das Ganze wiederholt und das nächste Kindfenster an Enum() geliefert.
    -Kommt in Enum() 0 an, gibt es keine weiteren Kindfenster mehr und Enum() muss False zurückgeben. Damit endet auch die EnumChildWindows()-Funktion.
    Meine Projekte Genesis Game Engine | GFX | smartli.me - Der smarte URL shortener

    Bevor du irgendwas zitierst und falsch interpretierst... schau doch bitte, bitte, bitte, bitte, bitte einfach mal die Doku an: msdn.microsoft.com/en-us/libra…op/ms633494(v=vs.85).aspx

    Du codest ohne dein Hirn auch nur im entferntesten zu verwenden. Anstelle des Callbacks hauste einfach irgendwas rein. Beim Kontextparameter hauste mal nen std::vector rein (und das in C WinAPI :!: :!: ). Das Fensterhandle könnte stimmen. Jedoch hast du keine Ahnung was du überhaupt machst. So kannste nicht coden.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    Richtig, und wie kommst du dann darauf dass WNDENUMPROC ne leere struct. Man gucke mal auf MSDN, da wo die gesamte API schön dokumentiert ist
    lpEnumFunc [in]
    Type: WNDENUMPROC
    A pointer to an application-defined callback function. For more information, see EnumChildProc.

    der lParam ist irgendwas, dass man mit rein nehmen möchte, von mir aus n vector<>. Du musst also n Delegate darein packen. Könnte auch mit einem Lamda klappen. Ich würde dir trotzdem unbedingt anraten mal richtiges C++ zu nehmen, sowas ist wirklich Quatsch. Wenn Wrapper dann OO. Die for each Schleife ist mir auch nicht ganz koscher, ersetz dass mal durch die C++-Variente for( : ) z.B.

    C-Quellcode

    1. vector<int> v = {1, 2, 3, 45, 65, 9};
    2. for(auto& i : v)
    3. cout << i << "\t"
    4. cout << endl;

    oder halt per Iterator

    C-Quellcode

    1. for(auto itr = v.begin(); itr != v.end(); ++itr)
    2. cout << i << "\t";
    3. cout << endl;
    ich habe es eben auch gemerkt, muss ne Callback methode rein :whistling: und in dieser methode kann ich dann mit dem ChildWindow weiter Arbeiten und in eine List of IntPtr das Handle übergeben.
    Meine Projekte Genesis Game Engine | GFX | smartli.me - Der smarte URL shortener

    Ich hab das ganze mal zum testen in ne Win32 Konsolen Anwendung Geschrieben

    C-Quellcode

    1. int _tmain(int argc, _TCHAR* argv[])
    2. {
    3. HWND desktop = GetDesktopWindow();
    4. EnumChildWindows(desktop, hdls, 0);
    5. int wait;
    6. std::cout << "es werde die Desktop Childs Ausgegeben" << std::endl;
    7. std::cin >> wait;
    8. return 0;
    9. }
    10. BOOL CALLBACK hdls(HWND hwnd, LPARAM lParam)
    11. {
    12. std::cout << hwnd << std::endl;
    13. return TRUE;
    14. }


    der fehler beim Debugen


    Fehler 1 error C2065: 'hdls': nichtdeklarierter Bezeichner

    Meine Projekte Genesis Game Engine | GFX | smartli.me - Der smarte URL shortener

    xD danke, ich such da schon 30min naja ist halt ein Unterschied von VB.Net zu C++

    Edit:

    kann es sein das das unter C++/CLI nicht geht weil:

    4 IntelliSense: ein pointer-to-member ist für eine verwaltet-Klasse nicht gültig
    Meine Projekte Genesis Game Engine | GFX | smartli.me - Der smarte URL shortener

    Nö geht nicht, solls auch garnicht. Benutze nativen Code aus nativem Code und nicht aus Verwaltetem, ders nur zum Wrappen da. Wenns doch sein muss, gibts Marshal.GetDelegateForFunctionPointer() und Marshal.GetFunctionPointerForDelegate().
    Mach dir ne Win32 Dll und stell den CLI switch on, dann haste ne CLI Dll. Da benutzt du einfach entweder eine native Klasse für solche Sachen oder ne native Funktion (kein __clrcall). Wobei sowas eigentlich garnicht nativ gemacht werden muss, da reicht n DllImport in C# völlig. Bleib einfach erstmal komplett bei nativem ISO/Ansi Standard C++, bis du genug Ahnung von der Sprache hast und die Grundlagen sitzen.
    Hy, ich habe nun hoffentlich das richtige gefunden (Eigenschaften->C++->Allgemein->Common Langues Runtime Unterstützung auf /clr) aber nun kommt der Fehler

    Fehler 1 error D8016: Die Befehlszeilenoptionen /ZI und /clr sind inkompatibel.
    Meine Projekte Genesis Game Engine | GFX | smartli.me - Der smarte URL shortener

    Da du offensichtlich nicht gewillt bist, auch nur irgendwas von den Tipps der anderen umzusetzen werde ich dir das nochmal ganz langsam erklären.

    Die Grundlagen von VB.Net sind so ziemlich das einfachste, was es auf der Welt gibt.
    Du beherrschst die VB.Net Grundlagen >NICHT<.

    Jetzt versuchst du dich an C++/CLI, wo du offensichtlich auch nur code von irgendwo kopierst.
    Du hast GARKEINE AHNUNG davon, was du da tust.

    Du hast nun zwei Möglichkeiten.

    1. Möglichkeit: Gib programmieren auf, hol deinen Realschulabschluss nach und fang ganz von vorne an.

    2. Möglichkeit: Kauf dir ein Fachbuch zu der Sprache, die du erlernen willst, am besten gleich zwei oder drei.
    Diese Fachbücher liest du dann aufmerksam durch und schreibst nicht nur den code ab, der da drin steht.

    Da du meiner groben Schätzung zufolge bei ca. der hälfte der aktiven Nutzer des Forums schon auf der igno bist,
    rate ich dir dringend dazu, eine der beiden Möglichkeiten zeitnah umzusetzen.

    Grüße
    Splitty >_>
    Dann setz halt nicht ZI. Wieso willst du überhaupt mit CLI arbeiten ? Dass ist so wie hier benutzt nicht nur Schwachsinn, sondern dir geht der Kern der Sprache verloren. Die gesamte Standardbibliothek ist templatebasiert, ein C++ Programm ohne Templates ist schon n Designfehler. Templates kann man nicht in verwaltetem Code benutzen. Falls du doch noch irgendwann mal Interesse daran hast C++ zu lernen Lektüre
    auch die Tipps Angenommen.
    Nein, tust du nicht.
    Und genau deswegen, regen sich hier einige über Dein "Verhalten" auf.
    Dir wurde mehr als Dutzend mal gesagt, dass Du auf Deine Grammatik und Rechtschreibung zu achten hast.
    Dir wurde mehr als Dutzend mal gesagt, dass Du die Grundlagen von VB(!) erstmal lernen sollst, stattdessen rennst Du auf C# á C++ los.
    Ist genauso, als ob Du einfach um 23 Uhr auf die Straße rennst, ohne einen Ziel festgelegt zu haben, und hoffst, dir rennt jemand hinterher und ruft dein Ziel ins Ohr.

    Zuerst VB, dann pseudo-C#-GameTutorial,dann C++,
    plötzlich wieder in einer 2D-Engine, dann wieder C#, und natürlich C++, ah, und natürlich Java und dein Java-Forum.
    Pff

    Was soll das eigentlich werden?

    Hm, forum.byte-welt.net/threads/11…ndows-funktioniert-das-so