【问题标题】:ActiveX control inside PowerPoint slidePowerPoint 幻灯片中的 ActiveX 控件
【发布时间】:2013-09-04 02:22:55
【问题描述】:

我创建了一个非常简单的程序并将其公开为 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";
        }
    }
}

我检查了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");

但是,我得到的只是启动时出现以下错误:

  • $exception {“无法从注册表中读取密钥(来自 HRESULT 的异常:0x80040150 (REGDB_E_READREGDB))”} System.Exception {System.Runtime.InteropServices.COMException}

有趣的是,我可以通过导航到:Compuer\HKEY_CLASSES_ROOT\Tomor1.Form\CLSID 来查看注册表中的“密钥”

【问题讨论】:

    标签: c# .net powerpoint office-interop


    【解决方案1】:

    尽管我不太确定,但我怀疑问题一定出在 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);
                }
            }
        }
    

    【讨论】:

      猜你喜欢
      • 2014-04-17
      • 2011-03-01
      • 2013-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-15
      • 1970-01-01
      相关资源
      最近更新 更多