2012-10-24 16 views
8

Próbuję opracować Word Addin VSTO 2010. Posiada niestandardowy panel zadań z licznikiem czasu (kontrola użytkownika) w nim. Pomysł polega na tym, że po otwarciu dokumentu tekstowego całkowity czas (w godzinach i minutach) jest przekazywany do Addina, który z kolei przekazuje go do kontrolki licznika czasu. Po uruchomieniu dodatku w VS2010 i przekazaniu kontroli użytkownika dwie liczby całkowite wartości, tj. Godziny i minuty w Addin_Startup działa dobrze.Podawanie liczb całkowitych do VSTO 2010 Word Addin

Teraz próbuję otworzyć dokument tekstowy na kliknięciu przycisku ze strony asp.net. Kiedy kliknę przycisk, powinien otworzyć się dokument tekstowy, a czas w godzinach i minutach powinien zostać przekazany do dodatku, który następnie przekaże go do kontroli użytkownika i timer powinien działać przez określony czas.

Problem polega na tym, że nie można podać dwóch liczb całkowitych do dodatku i gdzie je przekazać. Oto mój kod, który czasami dać „Catastrophic błąd awaria” i inne czasy to daje mi „Nie można rzutować obiektu COM typu«system .__ ComObject»do interfejsu typu«MyWordAddin.IAddInUtilities»”

ThisAddin Class

namespace MyWordAddin 
{ 
    public partial class ThisAddIn 
    { 
     private ctlClock myUserControl; 
     private Microsoft.Office.Tools.CustomTaskPane myCustomTaskPane; 
     private int hour, min; 
     private AddInUtilities utilities; 

     protected override object RequestComAddInAutomationService() 
     { 
      if (utilities == null) 
      { 
       utilities = new AddInUtilities(); 
      } 
      return utilities; 
     } 

     public int Min 
     { 
      get { return min; } 
      set { min = value; } 
     } 

     public int Hour 
     { 
      get { return hour; } 
      set { hour = value; } 
     } 


     public Microsoft.Office.Tools.CustomTaskPane MyCustomTaskPane 
     { 
      get { return myCustomTaskPane; } 
      set { myCustomTaskPane = value; } 
     } 

     public void ThisAddIn_Startup(object sender, System.EventArgs e) 
     { 
      //MessageBox.Show("Start Up Called"); 
      myCustomTaskPane.VisibleChanged += new EventHandler(myCustomTaskPane_VisibleChanged); 

     } 
     public void setTime(int h, int m) 
     { 
      Hour = h; 
      Min = m; 
      myUserControl = new ctlClock(Hour, Min); 
      //myUserControl = new ctlClock(0, 1); 
      myCustomTaskPane = this.CustomTaskPanes.Add(myUserControl, "Remaining Time"); 
      myCustomTaskPane.Visible = true; 
     } 

     private void yCustomTaskPane_VisibleChanged(object sender, System.EventArgs e) 
     { 
      Globals.Ribbons.ManageTaskPaneRibbon.toggleButton1.Checked = myCustomTaskPane.Visible; 
     } 

     private void ThisAddIn_Shutdown(object sender, System.EventArgs e) 
     { 
     } 

AddinUtilities klasy

namespace MyWordAddin 
{ 
    [ComVisible(true)] 
    [InterfaceType(ComInterfaceType.InterfaceIsDual)] 
    public interface IAddInUtilities 
    { 
     void setAddinTime(int h, int min); 
    } 

    [ComVisible(true)] 
    //[Serializable()] 
    [ClassInterface(ClassInterfaceType.None)] 
    public class AddInUtilities : StandardOleMarshalObject,IAddInUtilities 
    { 
     public void setAddinTime(int hour, int min) 
     { 
      Globals.ThisAddIn.setTime(hour, min);   

     } 

    } 


} 

Application Controller, która próbuje otworzyć dokument word i wysłać dwie liczby całkowite do addin

namespace ControllerApplication 
{ 
    public class CCWordApp 
    { 
     private Word._Application oWordApp; // a reference to Word application 

     public Word._Application OWordApp 
     { 
      get { return oWordApp; } 
      set { oWordApp = value; } 
     } 
     private Word.Document oWordDoc;  // a reference to the document 

     public Word.Document OWordDoc 
     { 
      get { return oWordDoc; } 
      set { oWordDoc = value; } 
     } 

     public CCWordApp() 
     { 
      // activate the interface with the COM object of Microsoft Word 
      oWordApp = new Word.Application(); 
      oWordDoc = new Word.Document(); 


     } 

     // Open a new document 
     public void Open() 
     { 
       object addinName = "MyWordAddIn"; 
       Microsoft.Office.Core.COMAddIn addin = oWordApp.COMAddIns.Item(addinName); 
       IAddInUtilities utils = null; 
        utils = (IAddInUtilities)addin.Object; 
        utils.setAddinTime(0, 8); 


      Object oMissing = System.Reflection.Missing.Value; 
      oWordApp.Visible = true; 
      oWordDoc = oWordApp.Documents.Add(ref oMissing, ref oMissing, ref oMissing, ref oMissing); 
      oWordDoc.Activate(); 
     } 

Po uruchomieniu aplikacji kontrolera, po kliknięciu zdarzenia przycisku uruchamiającego, czasami daje mi to "Katastrofalną awarię" innym razem daje mi "Nie można rzucić obiektu COM typu" System .__ ComObject "do typu interfejsu" MyWordAddin. IAddInUtilities "" i czasami zatrzymuje się na ostatnim wierszu kodu mówiąc "Instancja obiektu nie przekazana i obiekt". Pogrubiłem wybrałem kod, w którym powstaje błąd. Nie mogę zrozumieć, co tak naprawdę jest problemem i dlaczego nie mogę przekazać dwóch prostych liczb całkowitych do mojego dodatku. Na pewno coś robię w bardzo niewłaściwy sposób. Proszę, prowadź mnie.

+0

* ... pogrubienie wybrane kod, w którym pojawia się błąd * Gdzie jest błąd? Nie widzę pogrubionej selekcji. – SliverNinja

+2

Błąd pojawia się w otwartej funkcji aplikacji sterownika @ następujące wiersze utils = (IAddInUilities) addin.Obiekt; utils.setAddinTime (0, 8); – user1770669

+0

Jaki typ obiektu to 'addin.Object'? Spróbuj użyć ['GetCOMObjectType' używając interfejsu' IDispatch', aby zastanowić się nad instancją COM] (http://stackoverflow.com/a/10883851/175679). Czy możesz ustawić punkt przerwania, aby zobaczyć, czy 'RequestComAddInAutomationService' jest kiedykolwiek trafiony? – SliverNinja

Odpowiedz

0

Myślę, że należy zastąpić RequestCOMAddInAutomationService, ponieważ używasz VSTO.

Zobacz ten artykuł: How to call the Add-In functions from an external application?

Shared Add-In wykorzystuje sposób COMAddIn.Object narazić jego funkcje do zastosowań zewnętrznych, więc nasza realizacja OnConnection będzie mniej więcej wyglądać tak:

((COMAddIn) AddInInst) .Object = new MyAutomationObject();

Jednak tej metody nie można użyć w VSTO, ponieważ ustawienie COMAddIn.Object jest dozwolone tylko podczas funkcji OnConnection, a OnConnection nie jest widoczny w projekcie VSTO.

Daje przykład przesłanianie RequestCOMAddInAutomationService()

nadzieję, że pomoże!

Powiązane problemy