2013-08-31 113 views
0

我創建了一個非常簡單的程序並將其作爲ActiveX控件公開。我想要做的是將此控件嵌入到PowerPoint幻燈片中。該方案的代碼如下:PowerPoint幻燈片內的ActiveX控件

namespace WindowsFormsApplication1 
{ 
    [ProgId("Tomor.Form1")] 
    [ClassInterface(ClassInterfaceType.AutoDispatch)] 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      button1.Text = "Clicked"; 
     } 
    } 
} 

我cheked的Make the assembly COM-visible並且還檢查Register for COM-interop。我還實施了RegisterClassUnregisterClass方法(但在此處未顯示,請參閱this以獲得準確的實現),並且已經能夠使用regasm.exe成功註冊它。我也可以使用Tomor1.Form從另一個項目訪問界面。現在,我試圖插入這種控制到PowerPoint幻燈片如下:

 PowerPoint.Shape s = Sld.Shapes.AddOLEObject(0, 0, 400, 400, "Tomor.Form1"); 

然而,所有我得到的是在啓動時出現以下錯誤:

  • $異常{「不能(從HRESULT異常:0x80040150(REGDB_E_READREGDB))讀取從註冊表項「}的System.Exception {System.Runtime.InteropServices.COMException}

有趣的是,我可以通過導航到Compuer\HKEY_CLASSES_ROOT\Tomor1.Form\CLSID

回答

0

我可以在註冊表中看到「密鑰」即使我不太確定,我懷疑問題必須是使用ComRegisterFunction。我在其他地方發現了另一個實現,並且通過該實現,程序集已正確註冊,並且可以從PowerPoint訪問。 ComRegisterFunction的實現如下:

[ComRegisterFunction] 
    static void ComRegister(Type t) 
    { 
     string keyName = @"CLSID\" + t.GUID.ToString("B"); 
     using (RegistryKey key = 
      Registry.ClassesRoot.OpenSubKey(keyName, true)) 
     { 
      key.CreateSubKey("Control").Close(); 
      using (RegistryKey subkey = key.CreateSubKey("MiscStatus")) 
      { 
       // 131456 decimal == 0x20180. 
       long val = (long) 
        (OLEMISC.OLEMISC_INSIDEOUT 
        | OLEMISC.OLEMISC_ACTIVATEWHENVISIBLE 
        | OLEMISC.OLEMISC_SETCLIENTSITEFIRST); 
       subkey.SetValue("", val); 
      } 
      using (RegistryKey subkey = key.CreateSubKey("TypeLib")) 
      { 
       Guid libid = 
        Marshal.GetTypeLibGuidForAssembly(t.Assembly); 
       subkey.SetValue("", libid.ToString("B")); 
      } 
      using (RegistryKey subkey = key.CreateSubKey("Version")) 
      { 
       Version ver = t.Assembly.GetName().Version; 
       string version = 
        string.Format("{0}.{1}", ver.Major, ver.Minor); 
       subkey.SetValue("", version); 
      } 
     } 
    }