2012-10-24 4 views
8

VSTO 2010ワードアドインを開発しようとしています。それはカウントダウンタイマー(ユーザーコントロール)を持つカスタム作業ウィンドウを持っています。アイデアは、ワード文書が開かれたときに合計時間(時と分)がアドインに渡され、アドインがそれをカウントダウンタイマーコントロールに渡すというものです。私はVS2010でアドインを実行し、Addin_Startupでユーザコントロールの2つの整数値、つまり時間と分を渡すと正常に動作します。整数をVSTO 2010ワードアドインに渡す

今、私はasp.netページからボタンをクリックして単語文書を開こうとしています。ボタンをクリックすると、単語のドキュメントが開き、時間が分かり、分がアドインに渡され、それがユーザコントロールに渡され、タイマーが所定の時間実行されます。

問題アドインに2つの整数を渡す方法と、それをどこに渡すかを理解できません。それは私を与え、時には「致命的なエラーエラー」やその他の時間を与える私のコードである「タイプのCOMオブジェクトをキャストすることができません 『システム.__ ComObject』タイプのインタフェースに 『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つの整数を送信しようとし

コントローラアプリケーション

私がコントローラアプリケーションを実行すると、スタートボタンのクリックイベントによって、「致命的なエラー」が表示されることがあります。「COMオブジェクトをタイプ 'System .__ ComObject'をインターフェイスタイプ 'MyWordAddin'にキャストすることができません。 IAddInUtilities '"と呼び、最後のコード行に"オブジェクトインスタンスが渡されず、オブジェクト化されていません "と表示されることがあります。エラーが発生したコードを大胆に選択しました。私は本当にここでの問題が何であるかを理解できません。なぜ、2つの単純な整数を私のaddinに渡すことができないのですか?私が間違ったやり方でやっていることは確かです。私を案内してください。

+0

* ...太字でエラーが発生したコードを選択しました。*エラーはどこですか?私は大胆な選択肢が表示されません。 – SliverNinja

+2

コントローラアプリケーションのオープン関数@次の行にエラーが発生します。 utils =(IAddInUtilities)addin。オブジェクト。 utils.setAddinTime(0、8); – user1770669

+0

どのようなタイプのオブジェクトが 'addin.Object'ですか? 「IDispatch」インタフェースを使って['GetCOMObjectType'を使ってCOMインスタンスに反映させてください](http://stackoverflow.com/a/10883851/175679)。 'RequestComAddInAutomationService'にヒットしたかどうかを確認するためにブレークポイントを設定できますか? – SliverNinja

答えて

0

VSTOを使用しているため、RequestCOMAddInAutomationServiceをオーバーライドする必要があると思います。そうOnConnectionに の私たちの実装はおおよそ次のようになります、 How to call the Add-In functions from an external application?

共有アドインは、外部アプリケーションにその機能 を公開するCOMAddIn.Objectの方法を使用しています:

この記事を参照してください

((COMAddIn)AddInInst).Object = new MyAutomationObject();設定 COMAddIn.ObjectのみOnConnectionに機能中許可され OnConnectionには、VSTOプロジェクトで表示されていないため

しかし、この方法は、VSTOに使用することができません。それはRequestCOMAddInAutomationServiceを(オーバーライドの例を示します

役に立てば幸い!

関連する問題