Laden...

C# -> Word -> Macro (Visible=false)

5 Antworten
2,842 Aufrufe
Letzter Beitrag: vor 13 Jahren
C# -> Word -> Macro (Visible=false)

Hallo zusammen,

ich habe aufgrund eines nicht nachvollziebaren Fehler ein Kleines Testprogramm geschrieben, das nichts anderes macht wie MS Word 2010 (14) zu starten, ein Makro ausführt und dann Word wieder schließt. Dies Funktioniert auch wenn Word auf Visible = false und das Dokument auf Visibile = Type.Missing (default) eingestellt ist. Zumindest auf meinem PC. Ich habe das Programm an verschiedenen Systemen getestet bei uns im Haus:

Win XP -> Office 2003 -> geht
Win 7 -> Office 2010 -> geht

Beim Kunden in der Firma

Win 7 -> Office 2010 -> geht NICHT

Nachdem sich immer alle über viel Code freuen - hier der meinige (Testcode, kann gerne weiter verwendet werden) :



    logg("---------Start-----------");
            logg("Setup Vars");
            Word.Application oWord = null;
            Word.Documents oDocs = null;
            Word._Document oDoc = null;

            logg("Init Vars");

            object oMissing = System.Reflection.Missing.Value;
            object oVisible = Type.Missing;
            object oFile = "d:\\wordtest.docm";
            try
            {
                oWord = new Word.Application();

                logg("Word init complete");
                try
                {
                    logg("InteropVersion: " + oWord.Version);
                }
                catch
                {
                    logg("InteropVersion: (not found)");
                }

                // Create an instance of Word, make it visible,
                // and open Doc1.doc.
                // Word.ApplicationClass oWord = new Word.ApplicationClass();
                oWord.Visible = checkShow.Checked;

                if (oWord.Visible)
                {
                    logg("Word Visible = true");
                }
                else
                {
                    logg("Word Visible = false");
                }


                oDocs = oWord.Documents;



                string path;
                path = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);

                path += "\\docs\\wordtest.docm";




                oFile = path;

                logg("Using File: " + oFile);



                oDoc = oDocs.Open(ref oFile, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref                      oMissing, ref oMissing, ref oMissing, oVisible, ref oMissing, ref oMissing, ref oMissing, ref oMissing);



                // Run the macros.
                RunMacro(oWord, new Object[] { "HelloDate" });
                //RunMacro(oWord, new Object[]{"Enter"});

                // Quit Word and clean up.
                logg("Cleanup");

                if (checkClose.Checked || !checkShow.Checked)
                {
                    oDoc.Close(ref oMissing, ref oMissing, ref oMissing);
                    logg("Doc Closed");
                }
                System.Runtime.InteropServices.Marshal.ReleaseComObject(oDoc);
                oDoc = null;
                logg("Doc Com Object Closed");
                System.Runtime.InteropServices.Marshal.ReleaseComObject(oDocs);
                oDocs = null;
                logg("Docs Com Object Closed");
                if (checkClose.Checked || !checkShow.Checked)
                {
                    oWord.Quit(ref oMissing, ref oMissing, ref oMissing);
                    logg("Word closed");
                }
                System.Runtime.InteropServices.Marshal.ReleaseComObject(oWord);
                oWord = null;
                logg("Word Com Object Closed");

            }
            catch (Exception ex)
            {

                logg("EX: " + ex.Message + " (" + ex.GetType().ToString() + ")");
                if (ex.InnerException != null)
                {
                    logg("EX: " + ex.InnerException.Message);
                    if (ex.InnerException.InnerException != null)
                    {
                        logg("EX: " + ex.InnerException.InnerException.Message);

                    }
                }


            }




   private void RunMacro(object oApp, object[] oRunArgs)
        {
            logg("Run Macro: " + oRunArgs[0]);
            oApp.GetType().InvokeMember("Run",
                System.Reflection.BindingFlags.Default |
                System.Reflection.BindingFlags.InvokeMethod,
                null, oApp, oRunArgs);
        }


Die Execption im Hidden Modus von Word:

EX: Befehl misslungen (System.Runtime.InteropServices.COMException)

Durch langes googeln, bin ich schon auf Problematiken mit der Office Lizenz gestoßen:

Bei mir (geht alles):

LICENSE NAME: Office 14, OfficeAccess-Retail edition
LICENSE DESCRIPTION: Office 14, RETAIL channel
LICENSE STATUS: ---LICENSED---

Beim Kunden (geht nicht):

LICENSE NAME: Office 14, OfficeProPlus-MAK edition
LICENSE DESCRIPTION: Office 14, RETAIL channel
LICENSE STATUS: ---LICENSED---

OK mehr Ideen was ich noch schreiben könnte habe ich leider nicht.

MfG

Chris

Hallo,

hast Du schon mal die Ländereinstellungen verglichen. Ist es beides mal ein deutsches Windows 7 ?

Tschüss

Ja ist beides mal ein deutsches Win 7, habs grad in einer Englischen W7 VM getestet, ging auch.

Kann es sein das es ADS-Group-Policies gibt die die Ausführung von "unsichtbaren" Word aktionen unterdrückt?

Hallo,

ich denke es liegt weder an Windows noch an der Ländereinstellung.
Meiner Erfahrung nach klemmt es meistens in Word selber.
Vergleiche doch mal folgende Einstellungen von deinem Office2010 und jenem des Kunden:

<Datei><Optionen><Sicherheitscenter><Einstellungen für das Sicherheitscenter><Einstellungen für Makros>

Diese dürfen natürlich nicht deaktiviert sein, zudem muss dem Zugriff auf das VBA-Projektmodell vertraut werden.

Vielleicht ergibt dich da ja schon eine Differenz in der Word.Konfiguration...

hth

mfg Hurby

Die Welt hat genug für jedermanns Bedürfnisse, aber nicht für jedermanns Gier.

Nein leider hat sich hier nichts verändert.

Alle erlauben war schon drin.
Projektmodell vertrauen wurde gesetzt, keine Veränderung.

Hat noch wer vielleicht eine andere Idee?