2012-10-24 11 views
8

VSTO 2010 Word Addin geliştirmeye çalışıyorum. İçinde bir geri sayım sayacı (kullanıcı kontrolü) olan özel bir görev bölmesi vardır. Fikir, bir kelime belgesi açıldığında, toplam sürenin (saat ve dakika cinsinden), sırayla geri sayım zamanlayıcı kontrolüne geçtiği Addin'e geçirilmesidir. VS2010'da eklentiyi çalıştırdığımda ve kullanıcı denetimi iki tamsayı değerini yani saat ve dakikaları Addin_Startup uygulamasından geçirdiğimde iyi çalışıyor.Tam Sayıları VSTO 2010 Word'e Geçme

Şimdi bir asp.net sayfasından düğmeyi tıklatarak bir kelime belgesini açmaya çalışıyorum. Düğmeye tıkladığımda, bir word belgesi açılmalı ve saat ve dakika cinsinden süre, kullanıcı kontrolüne verilecek ve zamanlayıcı verilen süre boyunca çalışacak olan addin'e aktarılmalıdır.

Sorun, iki tam sayıyı eklentiye nasıl geçirileceğini ve bunların nereye iletileceğini anlayamıyorum. Aşağıdaki bazen bana verir "Geri dönülemez hata hata" ve diğer zamanlarını verecek olan benim kodudur

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) 
     { 
     } 

ThisAddin Class "tip 'MyWordAddin.IAddInUtilities' arayüz tipi COM nesnesi 'Sistem .__ comNesne' yayın yapılamıyor"

AddinUtilities sınıf

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 dosyası açın ve eklenti

iki tamsayı göndermeyi dener

Denetleyici Uygulaması

Denetleyici uygulamasını çalıştırdığımda, başlatma düğmesinin tıklama olayı üzerine, bazı zamanlarda bana "Katastrofik başarısızlık" verir, diğer zamanlarda bana verir "Nesne türüne 'System .__ ComObject' türünde COM nesnesine dönüştürülemiyor 'MyWordAddin. IAddInUtilities '"ve bazen kodun son satırında" Nesne örneği ve nesneye geçirilemedi "diyerek duruyor. Hatanın oluştuğu kodu kalın seçtim. Burada sorunun ne olduğunu anlayamıyorum ve neden eklediğim iki basit tam sayıyı geçemiyorum. Eminim çok yanlış bir şekilde yapıyorum. Lütfen bana yol göster.

+0

* ... bold, hatanın oluştuğu yerde kodu seçti * Hata nerede? Kalın seçimi görmüyorum. – SliverNinja

+2

Denetleyici uygulamasının açık işlevinde hata oluşur @ utils = (IAddInUtilities) addin.Nesne; utils.setAddinTime (0, 8); – user1770669

+0

'addin.Object' ne tür bir nesnedir? COM örneğini yansıtmak için 'IDCAPObjectType '' IDispatch 'arabirimini kullanarak kullanmayı deneyin (http://stackoverflow.com/a/10883851/175679). RequestComAddInAutomationService'in hiç vurulup vurulmadığını görmek için bir kesme noktası belirleyebilir misiniz? – SliverNinja

cevap

0

VSTO kullandığınız için RequestCOMAddInAutomationService'i geçersiz kılmanız gerektiğini düşünüyorum. böylece OnConnection bizim uygulanması kabaca aşağıdaki gibi görünecektir, How to call the Add-In functions from an external application?

Paylaşılan Add-In harici uygulamalara fonksiyonları ortaya çıkarmak için COMAddIn.Object şekilde kullanır:

bu makaleye bakın

((COMAddIn) AddInInst) .Object = new MyAutomationObject(); ayarı COMAddIn.Object sadece OnConnection işlevi sırasında izin verilir ve OnConnection VSTO projesinde görünür olmadığından

Ancak bu yöntem VSTO içinde kullanılamaz.

O RequestCOMAddInAutomationService() yardımcı

Umut basan bir örnek verir!