Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Mi Jul 16, 2025 17:24

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 17 Beiträge ]  Gehe zu Seite Vorherige  1, 2
Autor Nachricht
 Betreff des Beitrags:
BeitragVerfasst: So Sep 13, 2009 01:43 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
Aya hat geschrieben:
oc2k1 hat geschrieben:
Solange der script engine zur compilezeit die funktionsdefinition bekannt ist , ist es kein problem. Es gäbe da den sonderfall, das man au einer scriptsprache eine funktion aus einer dynamischen lib aufrufen will. Das würde nur mit assembler code gehen (oder man müste genau für die funktion einen prototypen mit exakt gleichen argumenten in der engine unterstützen)
Aber ob man dieses feature haben will ist sehr fraglich..... sobald ein script auf dlls zugreifen kann, kann es aus seiner Sandbox ausbrechen.


Das ist es ja was ich versuche zu erklären... der scriptengine bei 3ds Max sind zur compile-zeit NICHT die funktionsdefinitionen bekannt... lediglich deren namen und anzahl/typen der parameter. -> Wie machen die das?
Vermutlich über die Symboltabelle die es für jede DLL gibt oder den Symboltabellen für Debugmode, da findet man so tolle dinge wie Funktionsnamen, Parameteranzahl und typen. Es gibt einige Programmierer die diese Möglichkeit nehmen um reflection in c++ zu implementieren. Der Nachteil ist allerdings, dass man alle Symboldaten vom ganzen Code hat und das nicht förderlich ist für Kommerzielle Projekte. Noch dazu muss man für jeden Compilier und deren Versionen einen extra Reader schreiben. Es wäre auch möglich, dass die einfach Reflection auf die gute alte Art eingebaut haben. Unzwar statische KlassenInformationen, die per macros definiert wird und beim Programmstart verfügbar ist. Diese Variante kann alles was man von den üblichen RTTI Verdächtigen kennt und kann sogar noch mehr aber man muss in den Headern, der einzelnen Klassen Macros platzieren, die immer mit durchlaufen.
Hier mal ein Beispiel wie sowas aussieht.
Code:
  1. #include <iostream>
  2. #include "karmarama.hpp"
  3. #include "pattern/kar_reflection.hpp"
  4.  
  5. using namespace std;
  6.  
  7. class TKar_Widget:public TKar_Persistent
  8. {
  9.   protected:
  10.     unsigned int m_Width;
  11.     unsigned int m_Height;
  12.   public:
  13.     void SetWidth(unsigned int Width){m_Width=Width;}
  14.     void SetHeight(unsigned int Height){m_Height=Height;}
  15.     unsigned int GetWidth(){return m_Width;}
  16.     unsigned int GetHeight(){return m_Height;}
  17.  
  18.     BEGIN_DESCRIPTION_CLASS(TKar_Widget)
  19.       PROPERTY("Width",KAR_UINT,&TKar_Widget::SetWidth,&TKar_Widget::GetWidth)
  20.       PROPERTY("Height",KAR_UINT,&TKar_Widget::SetHeight,&TKar_Widget::GetHeight)
  21.     END_DESCRIPTION_CLASS()
  22. };
  23.  
  24. REGISTER_DESCRIPTION_CLASS(TKar_Widget,"TKar_Widget")
  25.  
  26. class TKar_Label:public TKar_Widget
  27. {
  28.   protected:
  29.     string m_Caption;
  30.   public:
  31.     void SetCaption(string Caption){m_Caption=Caption;}
  32.     string GetCaption(){return m_Caption;}
  33.  
  34.     BEGIN_DESCRIPTION_CLASS(TKar_Label)
  35.       PROPERTY("Caption",KAR_STRING,&TKar_Label::SetCaption,&TKar_Label::GetCaption)
  36.     END_DESCRIPTION_CLASS()
  37. };
  38.  
  39. REGISTER_DESCRIPTION_CLASS(TKar_Label,"TKar_Label")
  40.  
  41. int main()
  42. {
  43.   TKar_ReflectionClassManager& m=TKar_ReflectionClassManager::GetInstance();
  44.   if (m.Classes.size()>0)
  45.     for (unsigned int i=0;i<m.Classes.size();i++)
  46.     {
  47.       cout<<m.Classes[i]->GetName()<<endl;
  48.       if (m.Classes[i]->Properties.size()>0)
  49.         for (unsigned int j=0;j<m.Classes[i]->Properties.size();j++)
  50.           cout<<">"<<m.Classes[i]->Properties[j]->GetName()<<":"<<m.Classes[i]->Properties[j]->GetType()->GetName()<<endl;
  51.       TKar_Persistent* obj=m.Classes[i]->CreateInstance();
  52.       cout<<"object name:"<<obj->GetClassName()<<endl;
  53.     }
  54.  
  55.   TKar_Persistent* obj=m.Classes[1]->CreateInstance();
  56.   obj->SetValue<unsigned int>(0,5);
  57.   cout<<obj->GetValue<unsigned int>(0)<<endl;
  58.  
  59.   TKar_Widget* w=new TKar_Widget;
  60.   w->SetValue<unsigned int>("Height",5);
  61.   cout<<w->GetValue<unsigned int>("Height")<<endl;
  62. }

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Sep 13, 2009 13:48 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
Betreffend Reflection in C++ hab ich ein interessantes howto gefunden:

http://blogs.msdn.com/dowens/archive/2006/01/21/515861.aspx


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 17 Beiträge ]  Gehe zu Seite Vorherige  1, 2
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 7 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
[ Time : 0.012s | 15 Queries | GZIP : On ]