Aktuelle Zeit: 12.05.2025, 23:44

Alle Zeiten sind UTC + 1 Stunde




Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Problem mit GUI-EventReceiver
BeitragVerfasst: 04.12.2007, 20:30 
Offline
Benutzeravatar

Registriert: 04.12.2007, 16:06
Beiträge: 7
Hey... :)

Ich versuche grade ein wenig mich in die Engine einzuarbeiten und bin hier aber auf ein Problem mit dem EventReceiver gestoßen. Ich hab das Tutorial nachgebaut, bekomme aber jetzt beim Ausführen des Codes folgende Fehlermeldung von VS:

Code:
Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call.  This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.


Hier mal die wichtigen Code-Ausschnitte:

EventReceiver.h
Code:
#ifndef EVENTRECEIVER_H
#define EVENTRECEIVER_H

#include <Irrlicht.h>

using namespace irr;
using namespace gui;

class CMyEventReceiver : public IEventReceiver
{
private:
   IGUIEnvironment*      m_pGUIEnvironment;
public:
   CMyEventReceiver(IGUIEnvironment* pGUIEnv);
   CMyEventReceiver();
   ~CMyEventReceiver();

   void Initialize(IGUIEnvironment* pGUIEnv) { m_pGUIEnvironment = pGUIEnv; }

   virtual bool OnEvent(const SEvent& event);
};

#endif


EventReceiver.cpp
Code:
#include "EventReceiver.h"

CMyEventReceiver::CMyEventReceiver(irr::gui::IGUIEnvironment* pGUIEnv)
{
   m_pGUIEnvironment = pGUIEnv;
}

CMyEventReceiver::CMyEventReceiver()
{
}

CMyEventReceiver::~CMyEventReceiver(void)
{
}

bool CMyEventReceiver::OnEvent(const SEvent& event)
{
   if (event.EventType == EET_GUI_EVENT)
   {
      irr::s32 id = event.GUIEvent.Caller->getID();
      switch (event.GUIEvent.EventType)
      {
      case irr::gui::EGET_SCROLL_BAR_CHANGED:
         if (id == 104)
         {
            s32 pos = ((IGUIScrollBar*)event.GUIEvent.Caller)->getPos();

            for (s32 i=0;i < EGDC_COUNT ; i++)
            {
               video::SColor col = m_pGUIEnvironment->getSkin()->getColor((EGUI_DEFAULT_COLOR)i);
               col.setAlpha(pos);
               m_pGUIEnvironment->getSkin()->setColor((EGUI_DEFAULT_COLOR)i,col);
            }
         }
         return true;
      case EGET_BUTTON_CLICKED:
         if (id == 101)
         {
            m_pGUIEnvironment->addStaticText(L"test",core::rect<s32>(400,400,500,420),true, true, 0, -1, false);
         }
         return true;
      }
   }
   return false;
}


Und hier der relevante Part der main:
Code:
CMyEventReceiver* pER = new CMyEventReceiver(m_pGUIEnvironment);
m_pDevice->setEventReceiver(pER);


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Problem mit GUI-EventReceiver
BeitragVerfasst: 04.12.2007, 21:00 
Offline
Moderator
Benutzeravatar

Registriert: 25.03.2007, 18:11
Beiträge: 834
Wohnort: Hagen, NRW
Der Code sieht so weit in Ordnung aus.
Mach mal einen kompletten Rebuild des Projekts. Bei mir verschwinden diese Run-Time Check Failures dann meistens

_________________
Phenom X4 9950 BE | 6144MB DDR2-800 | GeForce 8800GT 512MB | Asus M3A32-MVP Deluxe | 2TB HDD | 520W Seasonic NT | Soprano Tower | Samsung 22" TFT + Fujitsu-Siemens 17" TFT + Toshiba 42" FullHD LCD | Windows 7 Proessional x64
Behind the Brain


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Problem mit GUI-EventReceiver
BeitragVerfasst: 04.12.2007, 21:12 
Offline
Benutzeravatar

Registriert: 04.12.2007, 16:06
Beiträge: 7
Hab ich schon mehrmals... sogar schon meinen C++ Dozenten gefragt O.o

Und jetzt plötzlich funktioniert gar nix mehr, auch nicht wenn ich die eventreceiver-relevanten zeilen auskommentiere -.-

Wenn ich hier an meinem Rechner zuhause was mit Irrlicht mache kommt auch so ein Runtime-Error, in der Uni gehts normalerweise O.o

edit:
schön, inzwischen funktionierts auch nich mehr wenn ich ein neues projekt mach (bzw solution) ^^ kommt auch der ESP error...

Hat da jemand ne idee dazu?!


edit2:
korrigiere... es hat irgendwas mit dem event-receiver zu tun... aber was? O.o


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Problem mit GUI-EventReceiver
BeitragVerfasst: 11.12.2007, 16:07 
Offline
Benutzeravatar

Registriert: 04.12.2007, 16:06
Beiträge: 7
Hat vll jemand ne Erklärung warum öfter mal diese EPS Errors kommen?! selbst wenn ich ganz normal das Tutorial 1 abschreibe kommt es bei mir zuhause, aber keine ahnung woran das liegt...


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Problem mit GUI-EventReceiver
BeitragVerfasst: 11.12.2007, 17:33 
Offline
Moderator
Benutzeravatar

Registriert: 15.04.2007, 20:20
Beiträge: 505
Wohnort: Reelsen
Du kannst mal versuchen, Irrlicht mit deinem Compiler neu zu kompilieren, sodass DLL und Programm den gleichen Compiler benutzen.
btw, normalerweise sollte man Klassen mit virtuellen Funktionen auch einen virtuellen Destruktor geben, sodass der richtige Destruktor benutzt wird, wird eine davon abgeleitete Klasse gelöscht.

_________________
Meine Gameengine :)
Bild


Nach oben
 Profil  
 
 Betreff des Beitrags: Re: Problem mit GUI-EventReceiver
BeitragVerfasst: 12.12.2007, 17:08 
Offline
Benutzeravatar

Registriert: 04.12.2007, 16:06
Beiträge: 7
Ich hab jetzt mal nochmal ne anwendung geschrieben wo ich NUR den event-receiver testen will... hier mal der code:

EventReceiver.h
Code:
#ifndef EVENTRECEIVER_H
#define EVENTRECEIVER_H

#include <Irrlicht.h>

using namespace irr;
using namespace gui;
using namespace scene;
using namespace io;
using namespace video;
using namespace core;

class CEventReceiver :
   public IEventReceiver
{
private:
   IGUIEnvironment*   pGUIEnvironment;
public:
   CEventReceiver(IGUIEnvironment* pGUI);
   ~CEventReceiver();

   virtual bool OnEvent(const SEvent &myevent);
};

#endif


EventReceiver.cpp
Code:
#include "EventReceiver.h"

CEventReceiver::CEventReceiver(IGUIEnvironment* pGUI)
{
   pGUIEnvironment = pGUI;
}

CEventReceiver::~CEventReceiver(void)
{
}

bool CEventReceiver::OnEvent(const SEvent &myevent)
{
   if (myevent.EventType == EET_GUI_EVENT)
   {
      s32 id = myevent.GUIEvent.Caller->getID();
      switch(myevent.GUIEvent.EventType)
      {
      case EGET_SCROLL_BAR_CHANGED:
         if (id == 104)
         {
            s32 pos = ((IGUIScrollBar*)myevent.GUIEvent.Caller)->getPos();

            for (s32 i=0;i< EGDC_COUNT; i++)
            {
               SColor col = pGUIEnvironment->getSkin()->getColor((EGUI_DEFAULT_COLOR)i);
               col.setAlpha(pos);
               pGUIEnvironment->getSkin()->setColor((EGUI_DEFAULT_COLOR)i, col);
            }
         }
         break;
      }
   }
   return false;
}


main.cpp
Code:
#include <windows.h>
#include <Irrlicht.h>
#include "EventReceiver.h"

using namespace irr;
using namespace core;
using namespace io;
using namespace gui;
using namespace scene;
using namespace video;

#pragma comment(lib,"Irrlicht.lib")

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
   IrrlichtDevice* pDevice = createDevice(EDT_DIRECT3D9, dimension2d<s32>(800,600), 32, false, false, false);
   pDevice->setWindowCaption(L"GUI Test");

   IVideoDriver* pVideoDriver = pDevice->getVideoDriver();
   ISceneManager* pSceneManager = pDevice->getSceneManager();
   IGUIEnvironment* pGUIEnvironment = pDevice->getGUIEnvironment();

   CEventReceiver* EvRe = new CEventReceiver(pGUIEnvironment);
   pDevice->setEventReceiver(EvRe);

   IGUIScrollBar* pScrollbar = pGUIEnvironment->addScrollBar(true, rect<s32>(0,0,150,15), 0, 104);
   //pScrollbar->setMax(255);

   while (pDevice->run() && pDevice->isWindowActive())
   {
      pVideoDriver->beginScene(true,true,SColor(255,255,255,255));
      //pSceneManager->drawAll();
      pGUIEnvironment->drawAll();
      pVideoDriver->endScene();
   }

   pDevice->drop();

   return 0;
}



Führe ich das jetzt so aus bekomm ich folgenden error:

Code:
Unhandled exception at 0x004123f6 in Irrlicht.exe: 0xC0000005: Access violation reading location 0x00000001.

Und zwar zeigt das "myevent" auf einen nicht passenden speicher...

Wenn ich in der main.cpp die beiden Zeilen mit dem EventReceiver auskommentiere, zeigt mir das programm einen weißen bildschirm mit einer scrollbar (genau wie gewünscht ;)...

Und noch ein problem:

Wenn ich die Kommentare bei pScrollbar->setMax(255); entferne kommt einer der erwähnten ESP errors O.o

Hat da vll jemand einen fehler auf den er mich aufmerksam machen könnte? ._.


Nach oben
 Profil  
 
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de