C#, WPF, vb.Net, vba, SQL Server, Access Programmierer, Excel, ASP Core MVC Webforms Telefon: 07022/9319004 freib. Software Entwickler   Kontakt
#

Download:

Datei 1: ActiveX_Code_Files.zip

Vorlage: ActiveX in Visual Studio 2017 und Office 2016 365

 

Dieses Beispiel liefert den Code und Dateien als Vorlage zum erstellen einer eigenen ActiveX Komponente für Office Anwendungen.

Das Project liegt als Dateien zum Download bei.

Weiter unten findet man den Code für das UserControl, welches die ActiveX Komponente darstellt.

 

Windows 10, Windows 7

Office 365, Office 2016, Word, Access, Excel, Powerpoint, Outlook

Geschrieben in c# oder Visual Basic .Net in höherem Framework wie 4, 4.7, damit es auch unter Windows 10 läuft

 

In Visual Studio sieht das ActiveX wie hier aus, als Windows Forms UserControl

 

Unter Microsoft Access sieht das eingebundene ActiveX so aus

 

In MS Access bindet man das ActiveX ein unter

Menü->Entwurf->ActiveX Steuerelemente..

Und dann wählt man im Dialog: ActiveX-Steuerelement einfügen das ActiveX Element aus, welches man selbst in Visual Studio definiert hat.

 

Über das eingebundene ActiveX hat man dann von MSAccess als Host Zugriff auf die Eigenschaften im ActiveX-Control.

Hier am Beispiel der Eigenschaft Textbox1, welche durch

Interface Properties

 public string Textbox1

..

Zur Verfügung gestellt wird

 

 

Der Code für das ActiveX Kontrol ist hier in reinem C# unter Windows Forms geschrieben.

Dabei ist natürlich auch WPF und andere eingebundene Komponenten möglich, da man über Schnittstellen die Daten an das Einbindende Programm wie Office übergibt.

Die eigentliche ActiveX Control befindet sich im UserControl1.cs in der Anwendung

C#, Winforms in Visual Studio

Wichtige Projekt Einstellungen

Man muss das Projekt im Kontext öffnen und in Application auf Assembly Information klicken

 

Assembly

In der Assembly Einstellungen muss man Make assemblx COM-Visible aktivieren

Die GUID muss neu und eindeutig sein. Der Title der Assembly wird in als ActiveX Komponente in Office Anwendungen als Name der Komponente sichtbar

Build

Unter Build/Compile muss man

Register for COM Op

aktivieren.

Danach kann man die App nur noch als Administrator entwickeln.

 

Signing

Unter Signing muss man dann Sign the assembly aktvieren und mit <New..> eine neue Signierung erstellen

 

Dann muss man einen freien Name unter Key File name eintragen und ein freies Passwort eintragen

 

Schliesslich sollte in Signing eine signierte name Key File mit der Endung .pfx stehen

 

Vorlage Code für das ActiveX

In C#, Framework 4.7

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Drawing;

using System.Data;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Windows.Forms;

 

// Add references

using System.Runtime.InteropServices;

using System.IO;

using System.Reflection;

using Microsoft.Win32;

 

 

namespace axGrid02

{

    [ProgId("axGrid02.UserControl1")]

    [ClassInterface(ClassInterfaceType.AutoDual), ComSourceInterfaces(typeof(UserControlEvents))]

    //[ComClass(UserControl1.ClassId, UserControl1.InterfaceId, UserControl1.EventsId)]

    public partial class UserControl1: UserControl

    {

         //--< IDs GUID >--

    //public const String ClassId = "147DF0FB-83F3-4BCB-9D55-F36E29C221FE";

    //public const String InterfaceId = "E43550AD-D09C-48CD-9D6B-B07FDE61B45C";

    public const String EventsId = "EC2581AC-1994-4C16-8172-6C360D07C3C0";

    //--</ IDs GUID >--

 

        #region Control

 

        public UserControl1()

        {

            InitializeComponent();

        }

        #endregion /Control

 

        #region Buttons

        //--------------------< region: Buttons >-----------------

        private void btnTest_Click(object sender, EventArgs e)

        {

            MessageBox.Show("this is ActiveX axGrid02");

        }

        private void btnSet_Click(object sender, EventArgs e)

        {

 

        }

        private void btnGet_Click(object sender, EventArgs e)

        {

 

        }

        private void buttonOK_Click(object sender, EventArgs e)

        {

            int NumVal;

 

            if (OnButtonClick != null)

            {

                //NumVal = (int)(numericUpDown1.Value);

                //OnButtonClick(NumVal);

            }

        }

        //--------------------< region: Buttons >-----------------

        #endregion  /Buttons

 

        #region Controls

        //----------< Controls >-------------

        private void ActiveXUserControl_Load(object sender, EventArgs e)

        {

 

        }

        //----------</ Controls >-------------

        #endregion /Controls

 

 

        #region Sys: Register As COM ActiveX

        //--------------------< region: Sys:Register COM ActiveX >-----------------

        // register COM ActiveX object

        [ComRegisterFunction()]

        public static void RegisterClass(string key)

        {

            StringBuilder skey = new StringBuilder(key);

            skey.Replace(@"HKEY_CLASSES_ROOT\", "");

 

            // récupérer GUID depuis ProgID="CsharpWindowsActiveX.ActiveXUserControl"

            Type myType1 = Type.GetTypeFromProgID("axGrid02.UserControl1");

            Console.WriteLine("ProgID=axGrid02.UserControl1 GUID={0}.", myType1.GUID);

 

            // ecrire GUID dans un fichier txt

            TextWriter tw;

            tw = File.CreateText("guid.txt");

            tw.WriteLine(skey.ToString());

            tw.WriteLine(myType1.GUID.ToString());

            tw.Close();

 

            RegistryKey regKey = Registry.ClassesRoot.OpenSubKey(skey.ToString(), true);

            RegistryKey ctrl = regKey.CreateSubKey("Control");

            ctrl.Close();

            RegistryKey inprocServer32 = regKey.OpenSubKey("InprocServer32", true);

            inprocServer32.SetValue("CodeBase", Assembly.GetExecutingAssembly().CodeBase);

            inprocServer32.Close();

            regKey.Close();

        }

 

 

        // Unregister COM ActiveX object

        [ComUnregisterFunction()]

        public static void UnregisterClass(string key)

        {

            StringBuilder skey = new StringBuilder(key);

            skey.Replace(@"HKEY_CLASSES_ROOT\", "");

            RegistryKey regKey = Registry.ClassesRoot.OpenSubKey(skey.ToString(), true);

            regKey.DeleteSubKey("Control", false);

            RegistryKey inprocServer32 = regKey.OpenSubKey("InprocServer32", true);

            regKey.DeleteSubKey("CodeBase", false);

            regKey.Close();

        }

        //--------------------< region: /Sys:Register COM ActiveX >-----------------

        #endregion /Sys:Register As COM ActiveX

 

 

        #region Interface Events

        //--------------------< region: Interface Events >-----------------

        //*Eventhandler interface   

        public delegate void ControlEventHandler(int NumVal);

 

        [Guid(EventsId)]

        [InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]

        public interface UserControlEvents

        {

            [DispId(0x60020001)]

            void OnButtonClick(int NumVal);

        }

 

        //----------< Events: Buttons >-------------

        public event ControlEventHandler OnButtonClick;

        public event ControlEventHandler OnBtnSetClick;

        public event ControlEventHandler btnGetClick;

        //----------</ Events: Buttons >-------------

 

        //--------------------</ region: Interface Events >-----------------

        #endregion /events

 

        #region Interface Properties

        //--------------------< region: Properties >-----------------

        //*Values are exchanged between Hosting-App and ActiveX-Control as GET-/ SET- Property

        public string Textbox1

        {

            get

            {

               // ptextVal = (int)(numericUpDown1.Value);

                return tbxText1.Text ;

            }

            set

            {

                tbxText1.Text = value;

                //numericUpDown1.Value = ptextVal;

            }

        }

        //--------------------</ region: Properties >-----------------

        #endregion /Interface Properties

 

        #region Interface Methods, Functions

        //--------------------< region: Methods, Functions >-----------------

        public interface ICOMCallable

        {

            string axSet_Textbox1_Text();

        }

 

        public string axSet_Textbox1_Text()

        {

            //int i = (int)(numericUpDown1.Value);

            //MessageBox.Show("ActiveX method: GetTextBoxValue " + i.ToString());

            //return (i);

            tbxText1.Text = "set by extenal function(..)";

            return "set Textbox1";

        }

        //--------------------</ region: Methods, Functions >-----------------

        #endregion /Interface Methods, Functions

 

    }

 

}

 

 

 

//notes:

//Referenz: http://www.codeguru.com/csharp/.net/net_general/comcom/article.php/c16257/Create-an-ActiveX-using-a-Csharp-Usercontrol.htm

 

Mobile
»
ActiveX COM Control: Email Client für Office Anwendungen
»
Projektvorlage für ein ActiveX Control
»
Email Send Control für Office Anwendungen
»
COM: Run-time error 2147024894 80070002 automation error The system can not find the specified file
»
COM Fehler: DllRegisterServer-Einstiegspunkt Fehlermeldung beim Registrieren einer ActiveX COM DLL
»
Vorlage Code: Eigenes ActiveX Control erstellen in Visual Studio 2017 und Office 2016 365
»
Winform, WPF: Einen Mail Client als SendMail Client in Net erstellen
»
Office Studio: Erstellen von eigenen COM Controls für MS Office Anwendungen
»
Fehler: The assembly could not be converted to a type library. Type library exporter encountered an error while processing

.

Jobs, Projekte, Angebote für Freiberufler, Selbstständig an Raimund.Popp@Microsoft-Programmierer.de