Probleme mit gcroot<T>



  • jap du hast recht, habe auf normal CLI umgestellt und alle * durch ^ ersetzt, jetzt funktioniert es soweit jedenfalls fehlerfrei.

    danke vielmals 🙂



  • Und warum compilierst Du mit "/clr:oldsyntax"? Würde ich dringend davon abraten.
    Aber mit "oldsyntax" stimmt natürlich das "*"...

    Also bei mir compiliert folgendes Beispiel problemlos (/clr):

    #include <vcclr.h>
    
    int main(array<System::String ^> ^args) 
    {
      System::Data::DataSet ^ds;
      System::Data::DataTable ^dt = ds->Tables[0];
      gcroot<System::Data::DataTable^> dtgc;
      dtgc = ds->Tables[0];
    }
    

    und folgendes auch mit "/clr:oldSyntax":

    #include <vcclr.h>
    
    int main() 
    {
      System::Data::DataSet *ds;
      System::Data::DataTable *dt = ds->Tables->get_Item(0);
      gcroot<System::Data::DataTable*> dtgc;
      dtgc = ds->Tables->get_Item(0);
    }
    

    (managed C++ kennt keine BuildIn-Indexer!)



  • (managed C++ kennt keine BuildIn-Indexer!)

    Ah... verdammmt. Stimmt. Das war ja der murks mit ->default 😕



  • Allerdings kennt er weder die Bezeichner IEnumerator noch ArrayList, was das Arbeiten mit OLE extrem erschwert.

    Woran liegt das?



  • Hast Du die Namensräume bekannt gemacht ?

    System::Collections::ArrayList

    System::Collections::Generic::IEnummerator



  • KaneMX schrieb:

    Allerdings kennt er weder die Bezeichner IEnumerator noch ArrayList

    !???
    Vielleicht an dem fehlenden

    using namespace System::Collections;
    

    !?



  • ok ich gebe zu, die frage war dumm und unnötig 😉

    natürlich funzt es jetzt, danke nochmal



  • leider gibt es wieder ein weiteres Problem, offensichtlich wieder mit einem index, wieder C2676:

    while(oEn->MoveNext())
      {    
        oRow = dynamic_cast<DataRow^>(oEn->Current);
    
        nID = System::Convert::ToInt32(oRow["id"]);               // C2676
        nBaujahr = System::Convert::ToInt32(oRow["baujahr"]);     // C2676
        nLeistung = System::Convert::ToInt32(oRow["leistung"]);   // C2676
      };
    

    1>.\cdb.cpp(71) : error C2676: binary '[' : 'gcroot<T>' does not define this operator or a conversion to a type acceptable to the predefined operator
    1> with
    1> [
    1> T=System::Data::DataRow ^
    1> ]



  • Was ist denn "oRow"?

    System::Data::DataRow ^dr;
      int i = System::Convert::ToInt32(dr["a"]);
    

    geht bei mir Problemlos...



  • PS: Warum verwendest Du den gcroot an stellen, wo es gar nicht nötig ist?
    gcroot wird *nur* benötigt, wenn Du ein managed Object in einer Klasse als *Member-Variable* ablegen willst!!! Innerhalb einer Methode kannst Du auch in einer "non-gc" Klasse direkt mit ^ arbeiten!


Anmelden zum Antworten