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.
* ... grassetto selezionato il codice in cui si verifica l'errore * Dove si trova l'errore? Non vedo la selezione in grassetto. – SliverNinja
L'errore si verifica nella funzione aperta dell'applicazione controller @ le seguenti righe utils = (IAddInUtilities) addin.Oggetto; utils.setAddinTime (0, 8); – user1770669
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