2012-10-24 40 views
8

Tôi đang cố gắng phát triển một VSTO 2010 Word Addin. Nó có một ngăn tác vụ tùy chỉnh với một đồng hồ đếm ngược (điều khiển người dùng) trong đó. Ý tưởng là khi một tài liệu từ được mở tổng thời gian (tính bằng giờ và phút) được chuyển đến Addin, lần lượt chuyển nó đến bộ đếm thời gian đếm ngược. Khi tôi chạy addin trong VS2010 và vượt qua kiểm soát người dùng hai giá trị số nguyên tức là giờ và phút trong Addin_Startup nó hoạt động tốt.Truyền số nguyên cho VSTO 2010 Word Addin

Bây giờ tôi đang cố gắng mở một tài liệu từ trên nút bấm từ một trang asp.net. Khi tôi bấm vào nút một tài liệu từ nên mở và thời gian trong giờ và phút nên được thông qua để addin mà sau đó sẽ cung cấp cho nó để kiểm soát người dùng và bộ đếm thời gian nên chạy trong thời gian nhất định.

Vấn đề là tôi không thể tìm ra cách để vượt qua hai số nguyên để addin và nơi để vượt qua chúng. Sau đây là mã của tôi mà đôi khi đưa ra "lỗi thất bại thảm khốc" và lần khác, nó mang lại cho tôi "Unable to cast đối tượng COM của loại 'Hệ thống .__ ComObject' giao diện gõ 'MyWordAddin.IAddInUtilities"

ThisAddin Lớp

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 lớp

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);   

     } 

    } 


} 

điều khiển ứng dụng mà cố gắng để mở tài liệu văn bản và gửi hai số nguyên với 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(); 
     } 

Khi tôi chạy ứng dụng điều khiển, khi bấm vào nút khởi động, một số lần cho tôi "lỗi thảm khốc" lần khác nó cho tôi "Không thể chuyển đối tượng COM kiểu 'System .__ ComObject' thành kiểu giao diện 'MyWordAddin. IAddInUtilities '"và đôi khi nó stucks trên dòng cuối cùng của mã nói rằng" Một trường hợp đối tượng không được thông qua và đối tượng ". Tôi đã in đậm mã mà lỗi phát sinh. Tôi không thể tìm ra những gì thực sự là vấn đề ở đây và tại sao tôi không thể vượt qua hai số nguyên đơn giản để addin của tôi. Chắc chắn có điều gì đó tôi đang làm một cách rất sai lầm. Xin vui lòng hướng dẫn cho tôi.

+0

* ... in đậm mã đã phát sinh lỗi * Lỗi ở đâu? Tôi không thấy lựa chọn in đậm. – SliverNinja

+2

Lỗi phát sinh trong chức năng mở của ứng dụng bộ điều khiển @ các dòng sau utils = (IAddInUtilities) addin.Vật; utils.setAddinTime (0, 8); – user1770669

+0

Loại đối tượng nào là 'addin.Object'? Hãy thử sử dụng ['GetCOMObjectType' bằng cách sử dụng giao diện' IDispatch' để phản ánh trên cá thể COM] (http://stackoverflow.com/a/10883851/175679). Bạn có thể thiết lập một điểm dừng để xem liệu 'RequestComAddInAutomationService' có bao giờ bị tấn công không? – SliverNinja

Trả lời

0

Tôi nghĩ bạn cần ghi đè lên RequestCOMAddInAutomationService vì bạn đang sử dụng VSTO.

Xem bài viết này: How to call the Add-In functions from an external application?

Shared Add-In sử dụng cách thức COMAddIn.Object để lộ chức năng của mình đến các ứng dụng bên ngoài, vì vậy thực hiện của chúng ta về OnConnection khoảng sẽ trông như thế này:

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

Tuy nhiên, phương pháp này không thể được sử dụng trong VSTO vì thiết lập COMAddIn.Object chỉ được phép trong chức năng OnConnection và OnConnection không hiển thị trong dự án VSTO.

Nó cung cấp một ví dụ về cách ghi đè các RequestCOMAddInAutomationService()

Hy vọng rằng sẽ giúp!

Các vấn đề liên quan