VSTO 2010 Word アドインを開発しようとしています。カウントダウン タイマー (ユーザー コントロール) を含むカスタム作業ウィンドウがあります。アイデアは、Word ドキュメントが開かれると、合計時間 (時間と分) がアドインに渡され、アドインがそれをカウントダウン タイマー コントロールに渡すというものです。VS2010 でアドインを実行し、ユーザー コントロールに 2 つの整数値、つまり Addin_Startup で時間と分を渡すと、正常に動作します。
今、asp.netページからボタンをクリックして単語文書を開こうとしています。ボタンをクリックすると、Word 文書が開き、アドインに時間と分が渡され、アドインがユーザー コントロールに渡され、指定された時間だけタイマーが実行されます。
問題は、アドインに 2 つの整数を渡す方法と、それらを渡す場所がわからないことです。以下は私のコードで、「壊滅的なエラー」が発生することもあれば、「タイプ 'System.__ComObject' の COM オブジェクトをインターフェイス タイプ 'MyWordAddin.IAddInUtilities' にキャストできません」と表示されることもあります。
ThisAddin クラス
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 クラス
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);
}
}
}
Word ドキュメントを開いてアドインに 2 つの整数を送信しようとするコントローラ アプリケーション
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();
}
コントローラー アプリケーションを実行すると、スタート ボタンのクリック イベントで、「壊滅的なエラー」が発生することもあれば、「'System.__ComObject' 型の COM オブジェクトをインターフェース型 'MyWordAddin.IAddInUtilities' にキャストできません」と表示されることもあります。 「オブジェクトインスタンスがオブジェクトに渡されていません」というコードの最後の行でスタックすることがあります。エラーが発生するコードを太字で選択しました。ここで実際に何が問題なのか、なぜアドインに 2 つの単純な整数を渡すことができないのかわかりません。私が非常に間違った方法でやっていることが確かにあります。私を案内してください。