Programmabbruch durch WordApplication??
-
Hallo,
Ich habe ne WordApp bei mir auf die Form gepackt. Und direkt nach dem Compilieren, noch bevor das Formular sichtbar wird, bekomme ich nen Programmabbruch!
Erste Gelegenheit für Exception bei $7737E124. Exception-Klasse EAccessViolation mit Meldung 'Zugriffsverletzung'. Prozess KiTaPlaner 1.2.exe (12176)
Erste Gelegenheit für Exception bei $7737E124. Exception-Klasse C/C++-Abbruch-Exception ($40000015) mit Meldung 'system exception (code 0x40000015) at 0x7737e124'. Prozess KiTaPlaner 1.2.exe (12176)Ich verstehe das überhaupt nicht! Hatte einer von euch das auch schon mal?
-
Stacktrace? Debugger benutzen?
-
Der bricht schon vor dem ersten Befehl im Konstrukor der Form auf! Da nützt kein Haltepunkt was
also schon vor
__fastcall TKTPMainForm::TKTPMainForm(TComponent* Owner) : TForm(Owner) {
-
ok, ich habe einen Haltepunkt setzen können! und zwar ist das das o hier drunter
o __fastcall TKTPMainForm::TKTPMainForm(TComponent* Owner): TForm(Owner) { // ein paar Kommentare o int ErsterBefehl = 1 ;
vor dem ersten Befehl aber kommt schon die Zugriffsverletzung. Heißt das, dass da etwas beim Erstellen der Komponente nicht funktioniert??
-
Verwende am besten nicht die Office-Komponenten sondern mach es zu Fuß das erspart dir viel ärger.
Variant V = CreateOleObject("Word.Application"); V.OlePropertyGet("Documents").OleProcedure("Add"); V.OlePropertySet("Visible", "true"); //Falls du das Dokument sichtbar haben willst Variant VSelection = V.OlePropertyGet("Selection"); Variant VFont = VSelection.OlePropertyGet("Font"); Variant VInlineShapes = VSelection.OlePropertyGet("InlineShapes"); Variant VActiveDocument = V.OlePropertyGet("ActiveDocument"); Variant VItem; //Schrift festlegen VFont.OlePropertySet("Size", 14); VFont.OlePropertySet("Bold", 9999998); //Fettschrift VSelection.OlePropertyGet("ParagraphFormat").OlePropertySet("Alignment", 1); //Center VSelection.OleProcedure("TypeText", StringToOleStr("Ich bin der erste Text in Word \n"));
-
Ich habe übrigends die WordApp-Komponente auf ein anderes Formular gezogen. Nun kann ich mein Programm wieder starten, aber der Pogrammabbruch kommt dann, wenn ich das andere Formular starte!
Kann ich dann trotzdem meinen Restcode behalten? Kann ich Platzhalter ersetzen, in Tabellen Felder nach rechts hangeln?
Platzhalter = "Platz_halter" ; TextErsatz = Edit->Text ; WordApp2->Selection->GoTo(OleVariant(wdGoToBookmark), TNoParam(), TNoParam(), OleVariant(StringToOleStr(Platzhalter)) ); WordApp2->Selection->set_Text(StringToOleStr(TextErsatz)); WordApp2->Selection->MoveRight(OleVariant(wdCell),TNoParam(),TNoParam()) ; WordApp2->Selection->TypeText(StringToOleStr(Edit2->Text));
-
Klar, kannst du alles was die WordApp-Komponente macht auch zu Fuss machen
denn die Komponente macht auch nichts anderes als per OLE mit Word zu kommunizieren (kapselt es nur in eine schönere "Form").Und wenn du ein wenig die geposteten codes anschaust, stellst du schnell die Gemeinsamheiten fest und ein umschreiben steht eigentlich nichts im wege.
-
Aber da funktioniert das doch alles anders ...
die ganzen Funktionen und Befehle sind vollkommen umstrukturiert! da such ich mich ja dumm und dämlich
-
Verwöhnter VCL Jung
-
naja ich hab jetzt schon ein paar Sachen herausgefunden! hoffe, das funktioniert mit allen befehlen so
Variant V = CreateOleObject("Word.Application"); Variant VDocuments = V.OlePropertyGet("Documents") ; VDocuments.OleProcedure("Open", StringToOleStr(DateiOeffnen)) ; Variant VSelection = V.OlePropertyGet("Selection"); // Platzhalter Firma ersetzen AnsiString Platzhalter = "GP_KW" ; AnsiString TextErsatz = "35. KW" ; VSelection.OleProcedure("GoTo", OleVariant(wdGoToBookmark), TNoParam(), TNoParam(), OleVariant(StringToOleStr(Platzhalter))) ; VSelection.OleProcedure("set_Text", StringToOleStr(TextErsatz)) ;
dass "Open" funktioniert super! aber das "GoTo" lässt er nicht compilieren! da bekomme ich nen Fehler in der sysvari.h (kein Plan, wo die Datei herkommt). Da stehen die OleProcedures drin beschrieben! Da gibts ne Mehrdeutigkeit zwischen const tagVARIANT und tagVARIANT !
Genaue Fehlermeldung:
[BCC32 Fehler] sysvari.h(1472): E2015 Mehrdeutigkeit zwischen '_fastcall operator System::Variant::=(const tagVARIANT &) at c:\program files (x86)\embarcadero\rad studio\7.0\include\vcl\sysvari.h:353' und '_fastcall operator System::Variant::=(tagVARIANT
at c:\program files (x86)\embarcadero\rad studio\7.0\include\vcl\sysvari.h:355'
Vollständiger Parser-Kontext
KTPMainFrm.cpp(6): #include KTPMainFrm.h
KTPMainFrm.h(1422): Entscheidung zum Instantiieren: void void System::Variant::OleProcedure<int,TNoParam,TNoParam,tagVARIANT>(const System::UnicodeString &,int,TNoParam,TNoParam,tagVARIANT)
--- Zurücksetzen des Parser-Kontexts für die Instantiierung...
KTPMainFrm.cpp(3): #include c:\program files (x86)\embarcadero\rad studio\7.0\include\vcl\vcl.h
vcl.h(10): #include c:\program files (x86)\embarcadero\rad studio\7.0\include\vcl\basepch0.h
basepch0.h(71): #include c:\program files (x86)\embarcadero\rad studio\7.0\include\vcl\System.hpp
System.hpp(840): #include c:\program files (x86)\embarcadero\rad studio\7.0\include\vcl\sysclass.h
sysclass.h(84): #include c:\program files (x86)\embarcadero\rad studio\7.0\include\vcl\sysvari.h
sysvari.h(116): namespace System
sysvari.h(182): class System::Variant
sysvari.h(1470): Analyse: void void System::Variant::OleProcedure<int,TNoParam,TNoParam,tagVARIANT>(const System::UnicodeString &,int,TNoParam,TNoParam,tagVARIANT)
-
MichelM schrieb:
Der bricht schon vor dem ersten Befehl im Konstrukor der Form auf! Da nützt kein Haltepunkt was
Dann deaktiviere mal die Laufzeit-Packages und aktiviere das "Linken mit Debug-Bibliotheken", dann bekommst du einen ordentlichen Stacktrace durch den RTL/VCL-Code.
VergissEs schrieb:
Verwende am besten nicht die Office-Komponenten sondern mach es zu Fuß das erspart dir viel ärger.
Ärger welcher Art?
-
Wahrscheinlich bin ich wieder zu blöd zum Suchen
aber wo finde ich denn "Linken mit Debug-Bibliotheken" ?Die Laufzeit-Packages waren schon deaktiviert ...
Ja auch bei dem von Hand erstellen habe ich Ärger
Ich komme nicht weiter beim Textersetzen!
-
//Zur Textmarke gehen vSelection.Exec(Procedure("GoTo") << (int)wdGoToBookmark << 0 << 0 << "GP_KW"); //oder VSelection.OleProcedure("GoTo", OleVariant(wdGoToBookmark), TNoParam(), TNoParam(), StringToOleStr(Platzhalter)); //den Text eintragen: vSelection.OleProcedure("TypeText", StringToOleStr(TextErsatz));
audacia schrieb:
Ärger welcher Art?
z.B. Umstellungen oder/auch Verwendung von OpenOffice
-
@Vergiss es:
Hast du meinen einen Beitrag nicht gelesen?
VergissEs schrieb:
[cpp]//Zur Textmarke gehen
VSelection.OleProcedure("GoTo", OleVariant(wdGoToBookmark), TNoParam(), TNoParam(), StringToOleStr(Platzhalter));Funktioniert nicht, da ich beim Compilieren 2 mal den Fehler bekomme:
[BCC32 Fehler] sysvari.h(1472): E2015 Mehrdeutigkeit zwischen '_fastcall operator System::Variant::=(const tagVARIANT &) at c:\program files (x86)\embarcadero\rad studio\7.0\include\vcl\sysvari.h:353' und '_fastcall operator System::Variant::=(tagVARIANT
at c:\program files (x86)\embarcadero\rad studio\7.0\include\vcl\sysvari.h:355'
Vollständiger Parser-Kontext
KTPMainFrm.cpp(6): #include KTPMainFrm.h
KTPMainFrm.h(1422): Entscheidung zum Instantiieren: void void System::Variant::OleProcedureSystem::OleVariant,TNoParam,TNoParam,System::OleVariant(const System::UnicodeString &,System::OleVariant,TNoParam,TNoParam,System::OleVariant)
--- Zurücksetzen des Parser-Kontexts für die Instantiierung...
KTPMainFrm.cpp(3): #include c:\program files (x86)\embarcadero\rad studio\7.0\include\vcl\vcl.h
vcl.h(10): #include c:\program files (x86)\embarcadero\rad studio\7.0\include\vcl\basepch0.h
basepch0.h(71): #include c:\program files (x86)\embarcadero\rad studio\7.0\include\vcl\System.hpp
System.hpp(840): #include c:\program files (x86)\embarcadero\rad studio\7.0\include\vcl\sysclass.h
sysclass.h(84): #include c:\program files (x86)\embarcadero\rad studio\7.0\include\vcl\sysvari.h
sysvari.h(116): namespace System
sysvari.h(182): class System::Variant
sysvari.h(1470): Analyse: void void System::Variant::OleProcedureSystem::OleVariant,TNoParam,TNoParam,System::OleVariant(const System::UnicodeString &,System::OleVariant,TNoParam,TNoParam,System::OleVariant)VergissEs schrieb:
[cpp]//Zur Textmarke gehen
vSelection.Exec(Procedure("GoTo") << (int)wdGoToBookmark << 0 << 0 << "GP_KW");Hier bekomme ich zur Laufzeit einen Zugriffsfehler!
Ich hatte mir nämlich schon diesen tollen Link zu Gemüte geführt und dachte, der ist eine Goldgrube
http://www.bytesandmore.de/rad/index.htm?http://www.bytesandmore.de/rad/cpp/snipp/sc06023.php
-
VergissEs schrieb:
audacia schrieb:
Ärger welcher Art?
z.B. Umstellungen oder/auch Verwendung von OpenOffice
Könntest du darauf etwas ausführlicher eingehen? Was heißt "z.B. Umstellungen"? Welchen Umstellungen soll da das (wie wir gerade sehen) fehleranfälligere Late-binding-Interface besser standhalten? Und willst du sagen, daß man Late-binding-Calls ohne Anpassung auf OpenOffice übertragen könnte?
MichelM schrieb:
Wahrscheinlich bin ich wieder zu blöd zum Suchen
aber wo finde ich denn "Linken mit Debug-Bibliotheken" ?Das wird nur für C++Builder <= 6 benötigt; du scheinst den Fehlermeldungen zufolge C++Builder 2010 zu verwenden, da reicht das Deaktivieren der Laufzeit-Packages.
(Wenn du nächstes Mal einfach deine C++Builder-Version dazuschreibst, muß ich nicht herumraten.)
Du kannst überprüfen, ob Debug-Informationen für die VCL vorhanden sind, indem du die Anwendung im Debugger startest, dann die Modulansicht öffnest (Strg+Shift+M), die Executable auswählst und überprüfst, ob in der Unit-Liste unten neben deinen eigenen Quelldateien (*.cpp) auch VCL- und RTL-Units (System.pas, SysUtils.pas, ..., Forms.pas) aufgelistet werden.
Falls das nicht der Fall ist, stelle sicher, daß dein Bibliothekspfad in der Debug-Konfiguration zualleroberst den Eintrag "$(BDS)\lib\debug" enthält.
-
audacia schrieb:
(Wenn du nächstes Mal einfach deine C++Builder-Version dazuschreibst, muß ich nicht herumraten.)
Ok, ist ab dem nächsten Beitrag immer dabei!
audacia schrieb:
Du kannst überprüfen, ob Debug-Informationen für die VCL vorhanden sind, indem du die Anwendung im Debugger startest, dann die Modulansicht öffnest (Strg+Shift+M), die Executable auswählst und überprüfst, ob in der Unit-Liste unten neben deinen eigenen Quelldateien (*.cpp) auch VCL- und RTL-Units (System.pas, SysUtils.pas, ..., Forms.pas) aufgelistet werden.
Falls das nicht der Fall ist, stelle sicher, daß dein Bibliothekspfad in der Debug-Konfiguration zualleroberst den Eintrag "$(BDS)\lib\debug" enthält.
Also du wirst wahrscheinlich gleich die Hände überm Kopf zusammenschlagen
, aber ich muss mal fragen, wie ich meine Anwendung im Debugger starte? Also ich starte meine Anwendung immer mit dem grünen Pfeil (F9); und unter "Start" gibt es nur noch "ohne Debugger ausführen". Startet der sozusagen immer im Debugger?
Edit:
Habe jetzt über "Ansicht" das "Module"-Fenster gefunden und auch die Unitsauflistung mit SysUtils.pas, System.pas etc. !
-
MichelM schrieb:
Also du wirst wahrscheinlich gleich die Hände überm Kopf zusammenschlagen
, aber ich muss mal fragen, wie ich meine Anwendung im Debugger starte?
Hast du mal, wie meiner Erinnerung nach schon öfter vorgeschlagen, das Debugger-Tutorial von junix durchgearbeitet? Du kannst die meisten Fragen zum Thema auch mithilfe der Dokumentation beantworten.
MichelM schrieb:
Also ich starte meine Anwendung immer mit dem grünen Pfeil (F9); und unter "Start" gibt es nur noch "ohne Debugger ausführen". Startet der sozusagen immer im Debugger?
Ja.
MichelM schrieb:
Habe jetzt über "Ansicht" das "Module"-Fenster gefunden und auch die Unitsauflistung mit SysUtils.pas, System.pas etc. !
Dann ist alles korrekt; das macht die Sache allerdings nicht einfacher.
Was passiert, wenn du die TWordApplication-Komponente im Code instantiierst?
-
audacia schrieb:
MichelM schrieb:
Also du wirst wahrscheinlich gleich die Hände überm Kopf zusammenschlagen
, aber ich muss mal fragen, wie ich meine Anwendung im Debugger starte?
Hast du mal, wie meiner Erinnerung nach schon öfter vorgeschlagen, das Debugger-Tutorial von junix durchgearbeitet? Du kannst die meisten Fragen zum Thema auch mithilfe der Dokumentation beantworten.
Ja das Ganze hatte ich mir schonmal zu Gemüte geführt! Habe ja auch immer fleißig debuggt!! Bloß manchmal bin ich noch etwas verwirrt mit euren Beschreibungen ^^
audacia schrieb:
Was passiert, wenn du die TWordApplication-Komponente im Code instantiierst?
Ich habe
TWordApplication *MyWordApp;
jetzt unter public bei den Benutzereingaben gepackt. Jetzt erstellt er die Form ordentlich! Die Komponente habe ich natürlich von der Form gelöscht, da iihm sonst die Klasse fehlt.
Aber irgendwas fehlt noch, da ich per Code noch nicht drauf zugreifen kann:MyWordApp->Connect(); MyWordApp->set_Visible(true); MyWordApp->Documents->Open(OleVariant(StringToOleStr(DateiOeffnen)));
Da bekomme ich Fehler, dass er nicht von der Adresse lesen kann! [b]
-
ok hatte das new vergessen!
TWordApplication *MyWordApp; MyWordApp = new TWordApplication(this) ; MyWordApp->Connect(); MyWordApp->set_Visible(true); MyWordApp->Documents->Open(OleVariant(StringToOleStr(DateiOeffnen)));
Dann bekomme ich bei
MyWordApp = new TWordApplication(this) ;
wieder den "Abnormal Programm Termination"
-
MichelM schrieb:
audacia schrieb:
Hast du mal, wie meiner Erinnerung nach schon öfter vorgeschlagen, das Debugger-Tutorial von junix durchgearbeitet? Du kannst die meisten Fragen zum Thema auch mithilfe der Dokumentation beantworten.
Ja das Ganze hatte ich mir schonmal zu Gemüte geführt! Habe ja auch immer fleißig debuggt!!
Wunderbar!
MichelM schrieb:
Dann bekomme ich bei
MyWordApp = new TWordApplication(this) ;
wieder den "Abnormal Programm Termination"
Passiert das auch, wenn du den relevanten Code in ein ansonsten neu erstelltes Projekt überträgst?
Möglicherweise - nur eine vage Vermutung - benutzt du in deinem Projekt irgendwelchen Code, der COM in einem Threading-Modus initialisiert, der mit TWordApplication inkompatibel ist.
Könntest du einen Breakpoint auf die Zeile mit "new TWordApplication(...)" setzen und mal in das Statement hineinsteppen (F7)?