2013-08-31 6 views
0

Я создал очень простую программу и выставил ее как элемент управления ActiveX. То, что я пытаюсь сделать, это встроить этот элемент управления в слайд PowerPoint. Код программы выглядит следующим образом:Управление ActiveX внутри слайда PowerPoint

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. Я также внедрил методы RegisterClass и UnregisterClass (но не показаны здесь, см. 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); 
      } 
     } 
    }