olefunktionen in threads verwenden - "coinitialize wurde nicht aufgerufen"



  • hallo
    ich habe eine funktion mit der ich daten aus meinem programm in excel exportieren kann. funktioniert auch ganz gut, da es aber teilweise sehr viele werte sein können ist mein programm blockiert wärend des exportvorganges. jetz möchte ich die export funktion in einen thread auslagern. dabei bekomme ich aber die exeption "coinitialize wurde nicht aufgerufen". soweit ich gesehen habe muss ich ole/com/dcom, oder was da auch immer zusammengehört, für jeden thread neu initialisieren. da ich mich das erste mal damit beschäftige blick ich noch nicht ganz durch. kann mir jemand zeigen wie man über einen thread auf excel zugreift?

    so habe ich es bisher gemacht:

    .h Datei:
    #include <comobj.hpp>
    #include <stdio.h>
    Variant MyEx;
    Variant MyWB;
    Variant MyWS;
    
    .cpp Datei:
    // Excel starten
     MyEx = CreateOleObject("Excel.Application");
     // Excel sichtbar machen
     MyEx.OlePropertySet("Visible", true);
    
     // Zugriff auf die Workbooks
     MyWB = MyEx.OlePropertyGet("Workbooks");
     // Neues Workbook erstellen
     MyWB.OleFunction("Add");
    
     // Zugriff auf das erste Worksheet
     MyWS = MyWB.OlePropertyGet( "Item" , 1 );
     MyWB = MyWS.OlePropertyGet( "Worksheets" );
    
     // Dem Worksheet einen Namen geben
     MyWB.OlePropertyGet( "Item" , 1 ).OlePropertySet( "Name", "Daten" );
    
     // Zugriff auf das erste Worksheet
     MyWS = MyWB.OlePropertyGet( "Item" , 1 );
    
     // Überschrift
     // Font nur für Zelle einstellen
     MyWS.OlePropertyGet( "Cells" ).OlePropertyGet( "Item", 1,1 ).OlePropertyGet("Font").OlePropertySet( "Bold" , true );
     MyWS.OlePropertyGet( "Cells" ).OlePropertyGet( "Item", 1,1 ).OlePropertyGet("Font").OlePropertySet( "Color" , clGreen );
     MyWS.OlePropertyGet( "Cells" ).OlePropertyGet( "Item", 1,1 ).OlePropertySet( "Value" , "Datenerfassung" );
    
     // Überschriften
     MyWS.OlePropertyGet( "Cells" ).OlePropertyGet( "Item", 3,1 ).OlePropertyGet("Font").OlePropertySet( "Bold" , true );
     MyWS.OlePropertyGet( "Cells" ).OlePropertyGet( "Item", 3,1 ).OlePropertySet( "Value" , "Datum" );
     MyWS.OlePropertyGet( "Cells" ).OlePropertyGet( "Item", 3,2 ).OlePropertyGet("Font").OlePropertySet( "Bold" , true );
     MyWS.OlePropertyGet( "Cells" ).OlePropertyGet( "Item", 3,2 ).OlePropertySet( "Value" , "Uhrzeit" );
     MyWS.OlePropertyGet( "Cells" ).OlePropertyGet( "Item", 3,3 ).OlePropertyGet("Font").OlePropertySet( "Bold" , true );
     MyWS.OlePropertyGet( "Cells" ).OlePropertyGet( "Item", 3,3 ).OlePropertySet( "Value" , "Messwert" );
    
     // Werte eintragen
     TDateTime DateAndTime;
     Randomize();
    
     for( int i = 5; i < 15; i++ )
     {
            Sleep(500);
            DateAndTime.CurrentDateTime();
            // Datum eintragen
            MyWS.OlePropertyGet( "Cells" ).OlePropertyGet( "Item", i,1 ).OlePropertySet( "Value" , DateAndTime.CurrentDate() );
            // Uhrzeit eintragen
            MyWS.OlePropertyGet( "Cells" ).OlePropertyGet( "Item", i,2 ).OlePropertySet( "Value" , DateAndTime.CurrentTime() );
            // Messwert
            MyWS.OlePropertyGet( "Cells" ).OlePropertyGet( "Item", i,3 ).OlePropertySet( "Value" , rand()%100 );
     }
    

    euer usbfreak



  • problem gelöst!!

    falls es noch ein paar gleichgesinnte geben sollte, hier die lösung:

    objbase.h inkludieren und als erstes im thread die funktion CoInitialise(NULL); aufrufen.
    Danach kann ganz normal weitergearbeitet werden.

    gruß usbfreak


Anmelden zum Antworten