[英]ActiveX control inside PowerPoint slide
我创建了一个非常简单的程序,并将其作为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
集成为Make the assembly COM-visible
,并检查了Register for COM-interop
的Register for COM-interop
。 我还实现了RegisterClass
和UnregisterClass
方法(但此处未显示,请参见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
,我可以在注册表中看到“键”
即使我不太确定,我也怀疑问题一定出在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);
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.