0

非常に単純なプログラムを作成し、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-interopRegisterClassメソッドとメソッドも実装しましたUnregisterClass(ただし、ここには示していません。正確な実装については、こちらを参照してください)。 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

4

1 に答える 1

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);
            }
        }
    }
于 2013-09-12T13:40:02.840 に答える