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.
* ... pogrubienie wybrane kod, w którym pojawia się błąd * Gdzie jest błąd? Nie widzę pogrubionej selekcji. – SliverNinja
Błąd pojawia się w otwartej funkcji aplikacji sterownika @ następujące wiersze utils = (IAddInUilities) addin.Obiekt; utils.setAddinTime (0, 8); – user1770669
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