Programmabbruch durch WordApplication??



  • 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)?



  • void __fastcall TKTPMainForm::WndProc(Messages::TMessage &Message)
    {
    // Cursor-Position bestimmen
    	switch (Message.Msg) {
    		case WM_SETCURSOR: {
    			POINT P;
    			GetCursorPos(&P);
    			::ScreenToClient(KTPMainForm->Handle, &P);  // Umrechnung auf betreffendes Formular bezogen
    			// anzeigen
    			if (dragndrop) {
    				ErzieherPanel->Left = P.x - ErzieherPanel->Width / 2 ;
    				ErzieherPanel->Top = P.y - ErzieherPanel->Height / 2 ;
    
    				LoeschX = P.x ;
    				LoeschY = P.y ;
    			}
    		}
    	}
    	TForm::WndProc(Message) ;
    }
    

    Damit lasse ich mir die aktuelle Mauszeigerposition übergeben. Meinst du sowas mit Threading-Modus?

    das mit dem neuen projekt probier ich gleich aus!!



  • Gleiche Sache in einem neuen Projekt!

    habe mit F7 hineingesteppt. Er geht in die Word_xp_srvr.cpp und kommt bis:

    void __fastcall TWordApplication::InitServerData()
    {
      static Oleserver::TServerData sd;
      sd.ClassID = CLSID_WordApplication;
      sd.IntfIID = __uuidof(_Application);
      sd.EventIID= __uuidof(ApplicationEvents3);
      ServerData = &sd;
    }
    

    Direkt danach bringt er die Zugriffsverletzung!!

    Falls es dir weiterhilft, hier, was im CDU-Fenster steht :

    Word_XP_srvr.cpp.184: }
    004DB418 5F               pop edi
    004DB419 5E               pop esi
    004DB41A 59               pop ecx
    004DB41B 5D               pop ebp
    004DB41C C3               ret 
    004DB41D 90               nop 
    004DB41E 90               nop 
    004DB41F 90               nop
    

    Nach Ablauf der Zeile 004DB41C C3 ret kommt der erste Zugriffsfehler!



  • MichelM schrieb:

    Gleiche Sache in einem neuen Projekt!

    Das ist gut. Dann liegt es an keinen Projektspezifika, wie etwa dem COM-Threading-Modell (das übrigens genau gar nichts mit Mauszeigerpositionen zu tun hat).

    MichelM schrieb:

    im CDU-Fenster

    😃

    MichelM schrieb:

    Nach Ablauf der Zeile 004DB41C C3 ret kommt der erste Zugriffsfehler!

    Wo landest du, wenn du bis zu dieser Zeile ausführst und dann F7 drückst?



  • audacia schrieb:

    MichelM schrieb:

    im CDU-Fenster

    😃

    hehe 😛

    audacia schrieb:

    MichelM schrieb:

    Nach Ablauf der Zeile 004DB41C C3 ret kommt der erste Zugriffsfehler!

    Wo landest du, wenn du bis zu dieser Zeile ausführst und dann F7 drückst?

    Ja wie wo lande ich? Ich komme bis zu dieser Zeile, und danach kommt der Fehler!
    Also er bleibt etwas unter

    "kernel32.RaiseException:
    7737E0CB 8BFF mov edi,edi"

    hängen. Aber ob dir das was hilft? 😃



  • MichelM schrieb:

    Ja wie wo lande ich? Ich komme bis zu dieser Zeile, und danach kommt der Fehler!
    Also er bleibt etwas unter

    "kernel32.RaiseException:
    7737E0CB 8BFF mov edi,edi"

    hängen. Aber ob dir das was hilft? 😃

    Es sagt mir, daß der Rücksprung fehlschlägt, weil auf dem Stack offenbar keine gültige Rücksprungadresse liegt. Das ist äußerst seltsam.

    Könntest du mal nachprüfen, welche Versionsnummer deine IDE hat? (im About-Dialog, so etwas wie 14.0.3615.26342)

    Und könntest du mir folgendes zur Untersuchung übermitteln:
    - ein vollständiges Minimalprojekt, das das Problem auf Knopfdruck (d.h. im Event-Handler eines Buttons auf der Form) reproduziert, mit deaktivierten Laufzeit-Packages
    - den kompletten Inhalt des "Debug"-Unterverzeichnisses, also die Executable, die *.tds- und *.map-Dateien und, wenn möglich, die *.obj-Dateien
    ?



  • Wo kann ich dir das hinschicken? an deine firmenadresse?

    als rar oder zip??

    So hier die Version:

    Embarcadero® C++Builder® 2010 Version 14.0.3513.24210



  • MichelM schrieb:

    Wo kann ich dir das hinschicken? an deine firmenadresse?

    Wäre eine Möglichkeit.

    MichelM schrieb:

    So hier die Version:

    Embarcadero® C++Builder® 2010 Version 14.0.3513.24210

    Ganz offenbar nicht die aktuellste. Installiere mal Update 4 und 5. Ich erinnere mich, daß einige ActiveX-Probleme behoben wurden; vielleicht auch dieses?



  • Dann werd ich mal nach den Updates schauen!

    Die Mail ist abgeschickt. Kannste nun zwischen rar und zip wählen 😉



  • So das Problem habe ich höchstwahrscheinlich gelöst! 🙂

    Es lag wohl daran, dass ich ein Projekt im Builder 2009 gleichzeitig mit einem Projekt im 2010er aufhatte!
    Da vertragen sich wohl die Typbibliotheken nicht miteinander. Ich hatte beide offne, dass ich Codebeispiele übertragen konnte.

    Aber vielen Dank für die Mühe!



  • MichelM schrieb:

    Die Mail ist abgeschickt. Kannste nun zwischen rar und zip wählen 😉

    Ich habe mir das mal angesehen, und interessanterweise weicht der Code, der bei dir für word_xp_srvr.cpp generiert wurde, von meinem ab. Bei dir steht

    word_xp_srvr.cpp.183: ServerData = &sd;
    0040446A 8B45FC           mov eax,[ebp-$04]
    0040446D C74034C81E5000   mov [eax+$30],$00501ec8
    

    , bei mir steht aber

    word_xp_srvr.cpp.183: ServerData = &sd;
    0040446A 8B45FC           mov eax,[ebp-$04]
    0040446D C74034C81E5000   mov [eax+$34],$00501ec8
    

    .

    Der wahrscheinlichste Grund dafür: du hast versucht, deine mit C++Builder 2010 übersetzte Anwendung mit einer .lib- oder .obj-Datei zu verknüpfen, die mit C++Builder 2009 erstellt wurde. Nicht verwunderlich, daß das nicht klappt - in diesem Fall führten Abweichungen im Objektlayout zu einem Laufzeitfehler.


Anmelden zum Antworten