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