2012-10-24 8 views
8

Sto cercando di sviluppare un componente aggiuntivo di Word 2010 per VSTO. Ha un pannello attività personalizzato con un conto alla rovescia (controllo utente) in esso. L'idea è che quando un documento word viene aperto, il tempo totale (in ore e minuti) viene passato all'Addin che a sua volta lo passa al controllo del timer per il conto alla rovescia. Quando eseguo l'addin in VS2010 e passo al controllo utente due valori di interi, vale a dire ore e minuti in Addin_Startup, funziona correttamente.Passaggio di interi al componente aggiuntivo di Word 2010 VSTO

Ora sto cercando di aprire un documento word sul pulsante clic da una pagina di asp.net. Quando clicco sul pulsante dovrebbe aprirsi un documento word e il tempo in ore e minuti dovrebbe essere passato all'addin che poi lo assegnerà al controllo utente e il timer dovrebbe essere eseguito per il tempo specificato.

Il problema è che non riesco a capire come passare due interi all'addin e dove passarli. Di seguito è riportato il mio codice che a volte dare "catastrofico errore di fallimento" e altre volte mi dà "Impossibile il cast di oggetti COM di tipo 'sistema di .__ ComObject' al tipo di interfaccia 'MyWordAddin.IAddInUtilities'"

ThisAddIn Classe

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 classe

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 che cerca di aprire il documento word e inviare due interi per il modulo aggiuntivo

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(); 
     } 

Quando eseguo l'applicazione controller, quando si fa clic sull'evento del pulsante di avvio, alcune volte mi danno "Catastrophic failure" altre volte che mi dà "Impossibile eseguire il cast dell'oggetto COM di tipo" System .__ ComObject "al tipo di interfaccia" MyWordAddin ". IAddInUtilities '"e talvolta si blocca sull'ultima riga di codice dicendo" Un'istanza dell'oggetto non passata e oggetto ". Ho selezionato in grassetto il codice in cui si verifica l'errore. Non riesco a capire quale sia davvero il problema qui e perché non posso passare due interi semplici al mio addin. Ci sono sicuramente qualcosa che sto facendo in un modo molto sbagliato. Per favore guidami.

+0

* ... grassetto selezionato il codice in cui si verifica l'errore * Dove si trova l'errore? Non vedo la selezione in grassetto. – SliverNinja

+2

L'errore si verifica nella funzione aperta dell'applicazione controller @ le seguenti righe utils = (IAddInUtilities) addin.Oggetto; utils.setAddinTime (0, 8); – user1770669

+0

Che tipo di oggetto è 'addin.Object'? Prova a usare ['GetCOMObjectType' usando l'interfaccia' IDispatch' per riflettere sull'istanza COM] (http://stackoverflow.com/a/10883851/175679). Puoi impostare un punto di interruzione per vedere se "RequestComAddInAutomationService" è mai stato colpito? – SliverNinja

risposta

0

Penso che sia necessario sovrascrivere RequestCOMAddInAutomationService perché si utilizza VSTO.

veda questo articolo: How to call the Add-In functions from an external application?

Shared aggiuntivo utilizza maniera COMAddIn.Object per esporre le sue funzioni alle applicazioni esterne, in modo dalla nostra implementazione di OnConnection sarà più o meno simile a questa:

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

Tuttavia, questo metodo non può essere utilizzato in VSTO perché l'impostazione COMAddIn.Object è consentito solo durante OnConnection funzione e il OnConnection non è visibile in progetto VSTO.

Si dà un esempio di sovrascrivendo il RequestCOMAddInAutomationService()

Speranza che aiuta!

Problemi correlati