9

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 つの単純な整数を渡すことができないのかわかりません。私が非常に間違った方法でやっていることが確かにあります。私を案内してください。

4

1 に答える 1

0

VSTOを使用しているため、RequestCOMAddInAutomationServiceをオーバーライドする必要があると思います。

この記事を参照してください: 外部アプリケーションからアドイン関数を呼び出す方法は?

Shared Add-Inは、COMAddIn.Objectの方法を使用して、その関数を外部アプリケーションに公開するため、OnConnectionの実装はおおよそ次のようになります。

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

ただし、COMAddIn.Objectの設定はOnConnection関数中にのみ許可され、OnConnectionはVSTOプロジェクトに表示されないため、このメソッドはVSTOでは使用できません。

RequestCOMAddInAutomationService()をオーバーライドする例を示します

お役に立てば幸いです。

于 2013-02-22T16:34:20.793 に答える