<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>programmierung Archive - Robert Skibbe</title>
	<atom:link href="https://robbelroot.de/blog/tag/programmierung/feed/" rel="self" type="application/rss+xml" />
	<link></link>
	<description>alias RobbelRoot – Freelance Full Stack Developer .NET</description>
	<lastBuildDate>Thu, 18 Jan 2024 00:52:44 +0000</lastBuildDate>
	<language>de</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://robbelroot.de/wp-content/uploads/2020/12/cropped-favicon-32x32.png</url>
	<title>programmierung Archive - Robert Skibbe</title>
	<link></link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>VB.NET Autostart für Dein eigenes Programm erstellen – 2024 Version</title>
		<link>https://robbelroot.de/blog/vb-net-autostart-fuer-dein-eigenes-programm-erstellen/</link>
					<comments>https://robbelroot.de/blog/vb-net-autostart-fuer-dein-eigenes-programm-erstellen/#respond</comments>
		
		<dc:creator><![CDATA[Robert Skibbe]]></dc:creator>
		<pubDate>Tue, 27 Dec 2022 05:40:27 +0000</pubDate>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[Visual Basic .NET]]></category>
		<category><![CDATA[Visual Basic .NET Problemlösungen]]></category>
		<category><![CDATA[automatisch]]></category>
		<category><![CDATA[autostart]]></category>
		<category><![CDATA[csharp]]></category>
		<category><![CDATA[dotnet]]></category>
		<category><![CDATA[erstellen]]></category>
		<category><![CDATA[programm]]></category>
		<category><![CDATA[programmieren]]></category>
		<category><![CDATA[programmierung]]></category>
		<category><![CDATA[shell]]></category>
		<category><![CDATA[shortcut]]></category>
		<category><![CDATA[start]]></category>
		<category><![CDATA[starten]]></category>
		<category><![CDATA[startup]]></category>
		<category><![CDATA[systemstart]]></category>
		<category><![CDATA[vbnet]]></category>
		<category><![CDATA[verknüpfung]]></category>
		<guid isPermaLink="false">https://robbelroot.de/?p=13290</guid>

					<description><![CDATA[<p>Dein VB.NET Programm automatisch bei Systemstart starten Hast Du Deine nächste tolle Anwendung entwickelt, Welche Du nun via VB.NET in den Autostart packen möchtest? Im heutigen Beitrag schauen wir uns genau das und mehr, wie z. B. das Erstellen von Verknüpfungen via der &#8222;WshShell&#8220; an. Bleib also dran, es wird &#8230;</p>
<p>Der Beitrag <a href="https://robbelroot.de/blog/vb-net-autostart-fuer-dein-eigenes-programm-erstellen/">VB.NET Autostart für Dein eigenes Programm erstellen – 2024 Version</a> erschien zuerst auf <a href="https://robbelroot.de">Robert Skibbe</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image size-full"><a href="https://robbelroot.de/wp-content/uploads/2022/12/VB.NET-Autostart-fuer-Dein-eigenes-Programm-erstellen-Programm-mit-Windows-starten-–-2023-Remake-Beitrags-Header.png"><img fetchpriority="high" decoding="async" width="1280" height="720" src="https://robbelroot.de/wp-content/uploads/2022/12/VB.NET-Autostart-fuer-Dein-eigenes-Programm-erstellen-Programm-mit-Windows-starten-–-2023-Remake-Beitrags-Header.png" alt="VB.NET Autostart für Dein eigenes Programm erstellen - Programm mit Windows starten" class="wp-image-13329" title="VB.NET Autostart für Dein eigenes Programm erstellen - Programm mit Windows starten"/></a><figcaption class="wp-element-caption">VB.NET Autostart für Dein eigenes Programm erstellen &#8211; Programm mit Windows starten</figcaption></figure>






<h2 class="wp-block-heading">Dein VB.NET Programm automatisch bei Systemstart starten</h2>



<p>Hast Du Deine nächste tolle Anwendung entwickelt, Welche Du nun via VB.NET in den Autostart packen möchtest? Im heutigen Beitrag schauen wir uns genau das und mehr, wie z. B. das Erstellen von Verknüpfungen via der &#8222;WshShell&#8220; an. Bleib also dran, es wird ziemlich interessant &#x1f609;!</p>



<p class="info-banner">&#x1f4a1; <strong>Hinweis</strong>: Wenn Du es eilig hast, kannst Du auch direkt zum Code weiter unten scrollen, bzw. das <strong><a href="#toc_container">Inhaltsverzeichnis</a></strong> für das Springen zu verschiedenen Eckpunkten verwenden. Auch wenn der Beitrag seinen Fokus auf VB.NET hat, sind alle Code-Beispiele natürlich auch für C# verfügbar! Springe für den <strong><a href="#kompletter-code">kompletten Code</a></strong>, oder für dessen <strong><a href="#verwendungsbeispiele">Verwendungsbeispiele</a></strong> nach unten.</p>



<style>
.info-banner {
    background: #03a9f4;
    padding: 2em;
    border-radius: 0.5em;
    color: whitesmoke;
}
.info-banner a {
    color: #FED766;
}
</style>



<p>Wie Du vielleicht weißt hatte ich auch schonmal ein Video zum Thema gemacht &#8211; vor unfassbaren 11 Jahren, oh man, ich werde alt.. Ein Abonnent hatte mich darauf aufmerksam gemacht, dass es in die Jahre gekommen ist und er sich ein Update wünscht. Dies war mir Befehl und nun sind wir hier &#x1f913;!</p>



<p>Wenn Du moderne Anwendungen entwickeln möchtest – Welche dann passenderweise in den Autostart können –, solltest Du Dir unbedingt diese beiden Beiträge anschauen:</p>



<ul class="wp-block-list">
<li><a href="https://robbelroot.de/blog/der-ultimative-inotifypropertychanged-guide/" target="_blank" rel="noreferrer noopener"><strong>Der ultimative INotifyPropertyChanged Guide – für C# &amp; VB.NET</strong></a></li>



<li><strong><a href="https://robbelroot.de/blog/der-ultimative-wpf-datagrid-mvvm-guide-csharp-und-vb-net/" target="_blank" rel="noreferrer noopener">Der ultimative WPF DataGrid MVVM Guide – C# &amp; VB.NET</a></strong></li>
</ul>



<h2 class="wp-block-heading">Als Video ansehen – &#8222;VB.NET Autostart von Programmen&#8220;</h2>



<p>Wenn Du es eiliger, bzw. eventuell keine Lust auf Text hast, kannst Du natürlich auch gerne zum Videoformat greifen und Dich berieseln lassen. Nutze auch im Video gerne die Kapitel, um zu den Stellen von besonderem Interesse zu springen.</p>


<div class="async-youtube" data-embed="ESRgqNvvfKg" data-alt="">
    <div class="play-button"></div>      
  </div>



<h2 class="wp-block-heading">Wie startet man Software überhaupt via Autostart?</h2>



<p>Bevor wir uns an die VB.NET-spezifische Thematik wagen, ist es ggf. vorerst ganz sinnvoll, sich mit dieser Frage auseinanderzusetzen: Wie starte ich ein Programm überhaupt bei Systemstart? Grundsätzlich ist die Antwort darauf ziemlich einfach, denn Windows bietet eigentlich alle Bordmittel, Die man als Administrator oder auch Entwickler, braucht.</p>



<p>Dazu gibt es den sogenannten Autostart-Ordner, Welcher ungefähr so wie gleich folgend aussieht. Bei mir ist – zugegebenermaßen – nicht viel dort zu sehen, denn ich versuche den immer &#8222;clean&#8220; zu halten.</p>



<figure class="wp-block-image size-full"><a href="https://robbelroot.de/wp-content/uploads/2022/12/VB.NET-Autostart-fuer-das-eigene-Programm-erstellen.png"><img decoding="async" width="851" height="505" src="https://robbelroot.de/wp-content/uploads/2022/12/VB.NET-Autostart-fuer-das-eigene-Programm-erstellen.png" alt="VB.NET Autostart für das eigene Programm erstellen" class="wp-image-13305" title="VB.NET Autostart für das eigene Programm erstellen"/></a><figcaption class="wp-element-caption">VB.NET Autostart für das eigene Programm erstellen</figcaption></figure>



<h3 class="wp-block-heading">Vorgehensweise</h3>



<p>Um ein Programm beim Start des Windows-Systems automatisch mit-starten zu lassen, muss man Dieses, bzw. eine Verknüpfung dazu in den Autostart-Ordner ablegen. Das Schöne ist hier wirklich die Möglichkeit der Verknüpfung, denn wer hat Lust, jedes Mal x Megabyte zu kopieren und eventuell dann doppelt zu haben. Ich persönlich hatte bei dieser Vorgehensweise auch nie Probleme, im Gegensatz zu einigen recherchierten Suchergebnissen auf Google. Kommentiere gerne, wenn auch Du auf derartige Probleme stößt, würde mich interessieren!</p>



<h3 class="wp-block-heading">Vorsicht geboten</h3>



<p>Wie erwähnt wird jedes Programm, bzw. jede Verknüpfung im genannten Ordner automatisch bei Systemstart gestartet. Das stattet uns Entwickler &amp; Administratoren natürlich auch mit einer großen Bürde aus. Erstens – so finde ich – sollte man dem Nutzer bei Systemstart nicht direkt 20 GUIs an den Kopf schmeißen und zweitens sollte man ja auch noch an die Startzeit denken. Wer hat schon Lust, 5 Minuten länger zu warten, nur weil ein Programm bei Start schon viel Auslastung zieht!?</p>



<h2 class="wp-block-heading">Welche Möglichkeiten habe ich beim Autostart?</h2>



<p>Egal ob mit VB.NET (oder C#..), oder ohne, wir haben verschiedene Möglichkeiten, den Autostart zu verwenden. Einerseits können wir benutzerspezifische Startmöglichkeiten verwenden, oder auch global, also für alle Nutzer einen automatischen Programmstart anlegen. In diesem Beitrag gehe ich jedoch in erster Linie auf den benutzerspezifischen Autostart ein.</p>



<h2 class="wp-block-heading">Wo, bzw. wie finde ich die Autostart-Ordner?</h2>



<figure class="wp-block-image size-full"><a href="https://robbelroot.de/wp-content/uploads/2022/12/75jxwu.jpg"><img decoding="async" width="888" height="499" src="https://robbelroot.de/wp-content/uploads/2022/12/75jxwu.jpg" alt="Wo, bzw. wie finde ich die Autostart-Ordner? VB.NET Autostart erstellen" class="wp-image-13331" title="Wo, bzw. wie finde ich die Autostart-Ordner? VB.NET Autostart erstellen"/></a><figcaption class="wp-element-caption">Wo, bzw. wie finde ich die Autostart-Ordner? VB.NET Autostart erstellen</figcaption></figure>



<p>In erster Linie kommt das natürlich darauf an, für wen Du einen Autostart erstellen möchtest. Möchtest Du Dein Programm z. B. für den aktuellen Nutzer in den Autostart legen, dann kommt folgendes Verzeichnis in Frage. Beachte hierbei, dass Du den Platzhalter natürlich durch den jeweiligen Nutzernamen ersetzen müsstest:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">C:\Users\&lt;DeinNutzername>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup</pre>



<p>Du kannst den Ordner auch vereinfacht finden, indem Du die Windows-Taste+R drückst, was den &#8222;Ausführen&#8220;-Dialog startet. Und im nächsten Schritt dann:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">shell:startup</pre>



<p>eingeben, was Dich dann in dem für Dich passenden Autostart-Ordner auskommen lässt. Cool, oder?</p>



<h3 class="wp-block-heading">Globaler Autostart-Ordner</h3>



<p>Möchtest Du hingegen den &#8222;globalen&#8220; Ordner finden, kannst Du stattdessen in folgendem Verzeichnis</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp</pre>



<p>und mit diesem Befehl hier fündig werden (denke an Windows-Taste+R):</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">shell:common startup</pre>



<p>Hier findest Du dann die Programme, Welche für alle Nutzer automatisch bei Systemstart gestartet werden sollen.</p>



<h2 class="wp-block-heading">Wie sieht der VB.NET Autostart nun aus?</h2>



<p>Um nun die oben erklärte Logik, bzw. Vorgehensweise mit VB.NET nachzubilden, müssen wir ja praktisch nichts Anderes tun. Wir müssen (via Code) eine Verknüpfung unserer Anwendung erschaffen und Diese nach Möglichkeit im Autostart-Ordner unserer Wahl unterbringen. Besonders die Erstellung einer Verknüpfung kann aber tricky sein, wenn man nicht weiß, wie.</p>



<p>Zusätzlich könnte man weitere Hilfsmittel schreiben, um z. B. überprüfen zu können, ob sich unsere Anwendung aktuell schon im Autostart befindet. Dies alles werden wir selbstverständlich nach Regeln der OOP (Objektorientierten Programmierung) in eine Klasse auslagern. So bleibt alles schön wiederverwendbar und portierbar.</p>



<p>Lege also im nächsten Schritt einen Ordner namens &#8222;Utils&#8220; in Deinem Projekt an und erstelle dort drin eine &#8222;Autostart&#8220;-Klasse.</p>



<h2 class="wp-block-heading">Mit VB.NET den Autostart-Ordner ermitteln</h2>



<figure class="wp-block-image size-full"><a href="https://robbelroot.de/wp-content/uploads/2022/12/Autostart-Ordner-mit-VB.NET-ermitteln.png"><img loading="lazy" decoding="async" width="640" height="360" src="https://robbelroot.de/wp-content/uploads/2022/12/Autostart-Ordner-mit-VB.NET-ermitteln.png" alt="Autostart-Ordner mit VB.NET ermitteln" class="wp-image-13386" title="Autostart-Ordner-mit-VB.NET-ermitteln"/></a><figcaption class="wp-element-caption">Autostart-Ordner mit VB.NET ermitteln</figcaption></figure>



<p>Bevor wir uns jedoch Gedanken über Dinge wie &#8222;Wie kann ich die Verknüpfung erstellen&#8220;, usw. machen, starten wir easy. Zuerst einmal müssen wir wissen, wie wir an den Autostart-Ordner kommen, ist ja schließlich Betriebssystem-Sache. Zufälligerweise benutzen wir eine optimale Sprache für dieses Betriebssystem vom selben Hersteller – kann ja dann nicht so schwer sein, richtig? Richtig!</p>



<p>Um an den Pfad zum Autostart-Ordner (auch Startup-Folder genannt) zu kommen, können wir vorgefertigte Funktionen nutzen. Die Methode unseres Vertrauens befindet sich in der <strong><a href="https://learn.microsoft.com/en-us/dotnet/api/system.environment?view=net-7.0" target="_blank" rel="noreferrer noopener">&#8222;Environment&#8220;-Klasse</a></strong> und heißt <strong><a href="https://learn.microsoft.com/de-de/dotnet/api/system.environment.getfolderpath?view=net-7.0" target="_blank" rel="noreferrer noopener">&#8222;GetFolderPath&#8220;</a></strong>. Diese erwartet einen Wert der <strong><a href="https://learn.microsoft.com/de-de/dotnet/api/system.environment.specialfolder?view=net-7.0" target="_blank" rel="noreferrer noopener">&#8222;SpecialFolder&#8220;-Enumeration</a></strong> aus selbiger Klasse.</p>



<p>Implementieren wir nun eine Art &#8222;Singleton&#8220;-, bzw. eine &#8222;Lazy&#8220;-Property (Eigenschaft), Welche uns den Autostart-Ordner serviert. So müssen wir der Environment nicht öfter als nötig auf die Nerven gehen &#8211; ergo, die Funktion nur einmalig aufrufen und den Rückgabewert zwischenspeichern:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="visualbasic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="VB.NET" data-enlighter-group="startup-directory-property">        Private Shared _startupDirectory As String

        Public Shared ReadOnly Property StartupDirectory As String
            Get
                If String.IsNullOrWhiteSpace(_startupDirectory) Then
                    _startupDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Startup)
                End If
                Return _startupDirectory
            End Get
        End Property</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="csharp" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="C#" data-enlighter-group="startup-directory-property">    private static string _startupDirectory;

    public static string StartupDirectory
    {
        get
        {
            if (string.IsNullOrWhiteSpace(_startupDirectory))
                _startupDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Startup);
            return _startupDirectory;
        }
    }</pre>



<h2 class="wp-block-heading">Einen Eintrag in den Autostart mit VB.NET hinzufügen</h2>



<p>Im nächsten Schritt schauen wir uns an, wie wir unsere VB.NET-Anwendung, bzw. eine Verknüpfung davon in den Autostart-Ordner gelegt bekommen. Dazu bauen wir uns eine kleine &#8222;AddEntry&#8220; Methode, Welcher es egal ist, ob ein Pfad zu unserer Anwendung mitkommt, denn Diesen, kann Sie auch selbst ermitteln. So bleibt uns die Möglichkeit übrig, fremde Anwendungen, sowie die Eigene gemütlich hinzuzufügen:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="visualbasic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="VB.NET" data-enlighter-group="add-entry-method">        ''' &lt;summary>
        ''' Adds an entry to the autostart folder for the given Application
        ''' &lt;/summary>
        ''' &lt;param name="applicationFilePath">The given application filepath, or empty to create an autostart for the current executing .exe&lt;/param>
        Public Shared Sub AddEntry(Optional applicationFilePath As String = "")
            Dim noAppPathProvided = applicationFilePath = ""
            If noAppPathProvided Then
                DefaultToExecutingExe(applicationFilePath)
            End If
            CreateShortcut(applicationFilePath)
        End Sub</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="csharp" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="C#" data-enlighter-group="add-entry-method">/// &lt;summary>
/// Adds an entry to the autostart folder for the given Application
/// &lt;/summary>
/// &lt;param name="applicationFilePath">The given application filepath, or empty to create an autostart for the currently executing .exe&lt;/param>
public static void AddEntry(string applicationFilePath = "")
{
    var noAppPathProvided = applicationFilePath == "";
    if (noAppPathProvided)
        DefaultToExecutingExe(applicationFilePath);
    CreateShortcut(applicationFilePath);
}</pre>



<p>Wie Du hier schon sehen kannst, schauen wir (wie erwähnt), ob ein passender &#8222;applicationFilePath&#8220; mitgeliefert wurde. Wenn nicht &#8222;Defaulten&#8220; wir zur ausführenden Exe-Datei, also dem aktuellen Programm. So oder so erstellen wir am Ende der Methode eine Verknüpfung, was wir im nächsten Schritt besprechen werden.</p>



<h2 class="wp-block-heading">Die ausgeführte .Exe-Datei erkennen</h2>



<p>Nachdem wir die eigentliche Methode schon einmal im letzten Schritt vorbereitet haben, fehlen nun noch die 2 Sub-Routinen. In erster Linie schauen wir hier uns hier schnell die &#8222;DefaultToExecutingExe&#8220;-Methode an. Diese bekommt einen &#8222;ByRef&#8220;-Parameter übergeben &#8211; empfand ich hier irgendwie leichter lesbar &#8211; aber ist nur meine Meinung. Diese setzt dann den &#8222;applicationFilePath&#8220; via &#8222;Process&#8220;-Klasse, bzw. mittels einer verschachtelten Sub-Eigenschaft des Prozesses. Diesen ermitteln wir mit der statischen &#8222;GetCurrentProcess&#8220;-Funktion der &#8222;Process&#8220;-Klasse. Hier gibt es ab .NET 6 auch eine neue Variante, allerdings habe ich hier Die genommen, Welche vermutlich am geläufigsten ist.</p>



<h2 class="wp-block-heading">Unsere VB.NET Anwendung als Verknüpfung in den Autostart legen</h2>



<p>Nun fehlt nur noch ein letztes Werkzeug, die Funktionalität, für unsere (und auch andere Anwendungen) eine Verknüpfung erzeugen zu können. Dies kann – wie oben bereits erwähnt – ein wenig tricky werden, wenn man nicht weiß, wie. Wir verwenden dazu das &#8222;WshShell&#8220;-Interface, Welches komischerweise instanziiert werden kann, Du glaubst mir nicht? Guck in den Code!</p>



<h3 class="wp-block-heading">COM-Verweis hinzufügen</h3>



<p>Bevor wir damit jedoch starten können, müssen wir zuerst noch den benötigten COM-Verweis auf das &#8222;Windows Script Host Object Model&#8220; hinzufügen. Das kannst Du ganz einfach machen, indem Du einen Rechtsklick auf Dein Projekt durchführst und anschließend &#8222;Hinzufügen-&gt;COM-Verweis&#8220; auswählst.</p>



<p>Danach erscheint dieses folgende Fenster, wo Du dann oben rechts dementsprechend z. B. nach &#8222;host&#8220; suchen kannst, dann dürftest Du – siehe Bild – schnell fündig werden:</p>



<figure class="wp-block-image size-full"><a href="https://robbelroot.de/wp-content/uploads/2022/12/VB.NET-Windows-Script-Object-Model-COM-Verweis.png"><img loading="lazy" decoding="async" width="789" height="506" src="https://robbelroot.de/wp-content/uploads/2022/12/VB.NET-Windows-Script-Object-Model-COM-Verweis.png" alt="VB.NET Windows Script Object Model COM-Verweis" class="wp-image-13370" title="VB.NET Windows Script Object Model COM-Verweis"/></a><figcaption class="wp-element-caption">VB.NET Windows Script Object Model COM-Verweis</figcaption></figure>



<h3 class="wp-block-heading">Ein instanziierbares Interface – what the f**?</h3>



<p>Um ehrlich zu sein – wie ich nunmal bin.. – habe ich mich selbst damit auch nicht auseinandergesetzt, warum man diese Schnittstelle instanziieren kann (auch in C#). Und da ich COM-Dinge eigentlich nie benötige, ist mir das hier auch relativ egal, solange es funktioniert. Ich gehe mal ohne Recherche davon aus, dass das an der Deklaration des Interfaces liegt, dort sehen wir ein &#8222;CoClass&#8220;-Attribut.</p>



<figure class="wp-block-image size-full"><a href="https://robbelroot.de/wp-content/uploads/2022/12/VB.NET-Verknuepfung-erstellen-WshShell-Interface.png"><img loading="lazy" decoding="async" width="444" height="194" src="https://robbelroot.de/wp-content/uploads/2022/12/VB.NET-Verknuepfung-erstellen-WshShell-Interface.png" alt="VB.NET Verknüpfung erstellen WshShell-Interface" class="wp-image-13364" title="VB.NET Verknüpfung erstellen WshShell-Interface"/></a><figcaption class="wp-element-caption">VB.NET Verknüpfung erstellen WshShell-Interface</figcaption></figure>



<p>Vermutlich wird &#8222;der Code&#8220; dann sehen: &#8222;Ah, da ist ein CoClass Ding, also muss ich das wohl instaziieren&#8220; – oder so ähnlich. EDIT: Habe kurz nachgeguckt, liegt wie vermutet an dem &#8222;CoClass&#8220;-Attribut – Erfahrung &#8222;strikes again&#8220; &#x1f609;!</p>



<h3 class="wp-block-heading">Eine Verknüpfung erstellen</h3>



<p>Nachdem wir das Interface nun instanziieren können – ew, klingt immer noch ekelig, na egal – tun wir gleich genau das. Vorher erstellen wir noch ein &#8222;FileInfo&#8220;-Objekt, Welches uns bei der Arbeit mit Datei-Infos wie den Namen der Datei, usw. unterstützen wird. Und dann gehen wir schonmal hin und erstellen den letztendlichen Pfad der Verknüpfung mit String-Interpolation.</p>



<p>Hier verwenden wir ein weiteres kleines Helferlein, was – wie der Name schon sagt – den Dateinamen ohne Dateiendung für uns herausfiltert. Dazu übergeben wir der statischen &#8222;Path&#8220;-Klassen-Funktion &#8222;GetFileNameWithoutExtension&#8220;, den Namen des &#8222;FileInfo&#8220;-Objektes.</p>



<p>Im letzten Schritt erzeugen wir die Verknüpfung auf Objekt-Ebene und casten Sie in ein für unsere Zwecke passendes Interface – &#8222;IWshShortcut&#8220;. Anschließend kannst Du weitere Eigenschaften wie z. B. die Beschreibung und den Icon-Pfad angeben, dies lasse ich hier aber aus. Zuletzt kommen die beiden wichtigsten Schritte: Den Ziel-Pfad, also den Pfad zur eigentlichen Anwendung festzulegen und dann final auch &#8222;Save&#8220; aufzurufen, damit die Verknüpfung tatsächlich erstellt wird.</p>



<h2 class="wp-block-heading">Prüfen ob ein Autostart-Eintrag existiert</h2>



<p>Nun haben wir die Funktionalität von oben vorliegen und würden direkt mit der Nächsten starten. Es wäre schließlich ganz nützlich, wenn man auch prüfen könnte, ob bereits eine Verknüpfung im Autostart ist. Dazu erstellen wir im nächsten Schritt eine &#8222;EntryExists&#8220;-Funktion, Welche dies über einen Boolean kommuniziert.</p>



<p>In den ersten Zeilen verfahren wir hier wir in der &#8222;AddEntry&#8220;-Methode, also bezogen auf die Pfad-Sache. Wenn kein Pfad angegeben wurde, nehmen wir den Pfad der aktuellen Exe-Datei, usw. Danach bauen wir uns den Pfad zur Verknüpfung (im Autostart-Ordner!) zusammen. Wenn eine derartige Datei (dort) existiert, dann haben wir das Programm bereits im Autostart – yay!</p>



<pre class="EnlighterJSRAW" data-enlighter-language="visualbasic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="VB.NET" data-enlighter-group="entry-exists-method">        Public Shared Function EntryExists(Optional applicationFilePath As String = "") As Boolean
            Dim noAppPathProvided = applicationFilePath = ""
            If noAppPathProvided Then
                DefaultToExecutingExe(applicationFilePath)
            End If
            Dim applicationFile = New FileInfo(applicationFilePath)
            Dim shortcutPath = Path.Combine(StartupDirectory, $"{Path.GetFileNameWithoutExtension(applicationFile.Name)}.lnk")
            Return IO.File.Exists(shortcutPath)
        End Function</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="csharp" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="C#" data-enlighter-group="entry-exists-method">public static bool EntryExists(string applicationFilePath = "")
{
    var noAppPathProvided = applicationFilePath == "";
    if (noAppPathProvided)
        DefaultToExecutingExe(applicationFilePath);
    var applicationFile = new FileInfo(applicationFilePath);
    var shortcutPath = Path.Combine(StartupDirectory, $"{Path.GetFileNameWithoutExtension(applicationFile.Name)}.lnk");
    return System.IO.File.Exists(shortcutPath);
}</pre>



<h2 class="wp-block-heading">Mit VB.NET den Autostart wieder entfernen</h2>



<p>Im letzten Abschnitt dieses Beitrages werden wir uns ansehen, wie wir erzeugte Einträge auch wieder entfernen können. Dies kennt man natürlich bereits aus größeren Tools. Wir schreiben also eine &#8222;RemoveEntry&#8220;-Methode, Welche sehr ähnlich zu den Vorherigen funktioniert. Zuerst prüfen wir wieder die Pfad-Übergabe, danach erstellen wir der Einfachheit halber eine &#8222;FileInfo&#8220; und danach generieren wir den Verknüpfungs-Pfad.</p>



<p>Wenn Dieser Pfad existent ist, wird er gelöscht, somit wird auch unser VB.NET Autostart entfernt. Beachte hierbei, dass ich bewusst kein Try-Catch drum gemacht habe. Ich möchte aktiv auf Fehler reagieren und diese separat und sauber verarbeiten können.</p>



<h2 class="wp-block-heading" id="kompletter-code">Kompletter Code</h2>



<figure class="wp-block-image size-full"><a href="https://robbelroot.de/wp-content/uploads/2022/12/Kompletter-Code-VB.NET-Autostart.png"><img loading="lazy" decoding="async" width="640" height="360" src="https://robbelroot.de/wp-content/uploads/2022/12/Kompletter-Code-VB.NET-Autostart.png" alt="Kompletter Code - VB.NET Autostart" class="wp-image-13384" title="Kompletter Code - VB.NET Autostart"/></a><figcaption class="wp-element-caption">Kompletter Code &#8211; VB.NET Autostart</figcaption></figure>



<p>Hier findest Du den wichtigsten Code für diesen Beitrag. In diesem Beispiel handelt es sich um die kleine von mir gebaute Hilfs-Klasse. Diese vereinfacht Dir die Erstellung der Programm-Verknüpfung innerhalb des Autostart-Ordners via VB.NET (und C#!):</p>



<pre class="EnlighterJSRAW" data-enlighter-language="visualbasic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="Autostart.vb" data-enlighter-group="complete-code">Imports System.IO
Imports IWshRuntimeLibrary

Namespace Utils

    Public Class Autostart

        Private Shared _startupDirectory As String

        Public Shared ReadOnly Property StartupDirectory As String
            Get
                If String.IsNullOrWhiteSpace(_startupDirectory) Then
                    _startupDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Startup)
                End If
                Return _startupDirectory
            End Get
        End Property

        ''' &lt;summary>
        ''' Adds an entry to the autostart folder for the given Application
        ''' &lt;/summary>
        ''' &lt;param name="applicationFilePath">The given application filepath, or empty to create an autostart for the current executing .exe&lt;/param>
        Public Shared Sub AddEntry(Optional applicationFilePath As String = "")
            Dim noAppPathProvided = applicationFilePath = ""
            If noAppPathProvided Then
                DefaultToExecutingExe(applicationFilePath)
            End If
            CreateShortcut(applicationFilePath)
        End Sub

        Private Shared Sub DefaultToExecutingExe(ByRef applicationFilePath As String)
            applicationFilePath = Process.GetCurrentProcess().MainModule.FileName
        End Sub

        Private Shared Sub CreateShortcut(applicationFilePath As String)
            Dim applicationFile = New FileInfo(applicationFilePath)
            Dim shortcutPath = Path.Combine(StartupDirectory, $"{Path.GetFileNameWithoutExtension(applicationFile.Name)}.lnk")
            Dim shell = New WshShell()
            Dim shortcut = CType(shell.CreateShortcut(shortcutPath), IWshShortcut)
            With shortcut
                ' .Description = ""
                ' .IconLocation = ""
                .TargetPath = applicationFile.FullName
                .Save()
            End With
        End Sub

        Public Shared Function EntryExists(Optional applicationFilePath As String = "") As Boolean
            Dim noAppPathProvided = applicationFilePath = ""
            If noAppPathProvided Then
                DefaultToExecutingExe(applicationFilePath)
            End If
            Dim applicationFile = New FileInfo(applicationFilePath)
            Dim shortcutPath = Path.Combine(StartupDirectory, $"{Path.GetFileNameWithoutExtension(applicationFile.Name)}.lnk")
            Return IO.File.Exists(shortcutPath)
        End Function

        Public Shared Sub RemoveEntry(Optional applicationFilePath As String = "")
            Dim noAppPathProvided = applicationFilePath = ""
            If noAppPathProvided Then
                DefaultToExecutingExe(applicationFilePath)
            End If
            Dim applicationFile = New FileInfo(applicationFilePath)
            Dim shortcutPath = Path.Combine(StartupDirectory, $"{Path.GetFileNameWithoutExtension(applicationFile.Name)}.lnk")
            IO.File.Delete(shortcutPath)
        End Sub

    End Class

End Namespace
</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="csharp" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="Autostart.cs" data-enlighter-group="complete-code">using System.IO;
using IWshRuntimeLibrary;

namespace Utils
{
    public class Autostart
    {
        private static string _startupDirectory;

        public static string StartupDirectory
        {
            get
            {
                if (string.IsNullOrWhiteSpace(_startupDirectory))
                    _startupDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Startup);
                return _startupDirectory;
            }
        }

        /// &lt;summary>
        ///         ''' Adds an entry to the autostart folder for the given Application
        ///         ''' &lt;/summary>
        ///         ''' &lt;param name="applicationFilePath">The given application filepath, or empty to create an autostart for the current executing .exe&lt;/param>
        public static void AddEntry(string applicationFilePath = "")
        {
            var noAppPathProvided = applicationFilePath == "";
            if (noAppPathProvided)
                DefaultToExecutingExe(ref applicationFilePath);
            CreateShortcut(applicationFilePath);
        }

        private static void DefaultToExecutingExe(ref string applicationFilePath)
        {
            applicationFilePath = Process.GetCurrentProcess().MainModule.FileName;
        }

        private static void CreateShortcut(string applicationFilePath)
        {
            var applicationFile = new FileInfo(applicationFilePath);
            var shortcutPath = Path.Combine(StartupDirectory, $"{Path.GetFileNameWithoutExtension(applicationFile.Name)}.lnk");
            var shell = new WshShell();
            var shortcut = (IWshShortcut)shell.CreateShortcut(shortcutPath);
            {
                var withBlock = shortcut;
                // .Description = ""
                // .IconLocation = ""
                withBlock.TargetPath = applicationFile.FullName;
                withBlock.Save();
            }
        }

        public static bool EntryExists(string applicationFilePath = "")
        {
            var noAppPathProvided = applicationFilePath == "";
            if (noAppPathProvided)
                DefaultToExecutingExe(ref applicationFilePath);
            var applicationFile = new FileInfo(applicationFilePath);
            var shortcutPath = Path.Combine(StartupDirectory, $"{Path.GetFileNameWithoutExtension(applicationFile.Name)}.lnk");
            return System.IO.File.Exists(shortcutPath);
        }

        public static void RemoveEntry(string applicationFilePath = "")
        {
            var noAppPathProvided = applicationFilePath == "";
            if (noAppPathProvided)
                DefaultToExecutingExe(ref applicationFilePath);
            var applicationFile = new FileInfo(applicationFilePath);
            var shortcutPath = Path.Combine(StartupDirectory, $"{Path.GetFileNameWithoutExtension(applicationFile.Name)}.lnk");
            System.IO.File.Delete(shortcutPath);
        }
    }
}</pre>



<h2 class="wp-block-heading" id="verwendungsbeispiele">Verwendung des Codes</h2>



<p>Um den obigen Code verwenden zu können, kannst Du z. B. 2 Knöpfe und eine CheckBox in Deine Form setzen. Beim Start des Formulares wird die Checkbox je nachdem ob das VB.NET Programm im Autostart liegt gefüllt. Wenn Du dann auf die jeweiligen Buttons drückst, kannst Du das Programm wieder aus dem Autostart entfernen, bzw. natürlich auch hinzufügen. Die Namen sind denke ich selbsterklärend..</p>



<pre class="EnlighterJSRAW" data-enlighter-language="visualbasic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="Form1.vb" data-enlighter-group="form-example">Imports AutoStartExampleVb.Utils

Public Class Form1

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        chbAutostartActivated.Checked = Autostart.EntryExists()
    End Sub

    Private Sub btnActivateAutostart_Click(sender As Object, e As EventArgs) Handles btnActivateAutostart.Click
        Autostart.AddEntry()
        chbAutostartActivated.Checked = True
    End Sub

    Private Sub btnDeactivateAutostart_Click(sender As Object, e As EventArgs) Handles btnDeactivateAutostart.Click
        Autostart.RemoveEntry()
        chbAutostartActivated.Checked = False
    End Sub

End Class</pre>



<pre class="EnlighterJSRAW" data-enlighter-language="csharp" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="Form1.cs" data-enlighter-group="form-example">using System;
using AutoStartExampleVb.Utils;

public class Form1
{
    private void Form1_Load(object sender, EventArgs e)
    {
        chbAutostartActivated.Checked = Autostart.EntryExists();
    }

    private void btnActivateAutostart_Click(object sender, EventArgs e)
    {
        Autostart.AddEntry();
        chbAutostartActivated.Checked = true;
    }

    private void btnDeactivateAutostart_Click(object sender, EventArgs e)
    {
        Autostart.RemoveEntry();
        chbAutostartActivated.Checked = false;
    }
}</pre>



<h2 class="wp-block-heading">Downloads</h2>



<p>Keine Lust alles zu kopieren und es manuell zusammen zu frickeln? Dann lade Dir hier einfach den Beispielcode herunter, Dieser beinhaltet die komplette und fertig testbare Projektmappe.</p>



<div class="wp-block-buttons is-layout-flex wp-block-buttons-is-layout-flex">
<div class="wp-block-button"><a class="wp-block-button__link wp-element-button" href="https://robbelroot.de/datei-download/?dlid=676ab19b-1548-4e62-891b-5a79d57bcf7f" target="_blank" rel="noreferrer noopener">AutoStartExampleVb.zip</a></div>


</div>
<p>Der Beitrag <a href="https://robbelroot.de/blog/vb-net-autostart-fuer-dein-eigenes-programm-erstellen/">VB.NET Autostart für Dein eigenes Programm erstellen – 2024 Version</a> erschien zuerst auf <a href="https://robbelroot.de">Robert Skibbe</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://robbelroot.de/blog/vb-net-autostart-fuer-dein-eigenes-programm-erstellen/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Chipkarten / Tags mit Arduino RFID Scanner auslesen</title>
		<link>https://robbelroot.de/blog/chipkarten-tags-mit-arduino-rfid-scanner-auslesen/</link>
					<comments>https://robbelroot.de/blog/chipkarten-tags-mit-arduino-rfid-scanner-auslesen/#comments</comments>
		
		<dc:creator><![CDATA[Robert Skibbe]]></dc:creator>
		<pubDate>Mon, 13 Jun 2022 14:09:16 +0000</pubDate>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Arduino (DE)]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[arduino]]></category>
		<category><![CDATA[atmega]]></category>
		<category><![CDATA[board]]></category>
		<category><![CDATA[entwickler]]></category>
		<category><![CDATA[ide]]></category>
		<category><![CDATA[mega]]></category>
		<category><![CDATA[mikrocontroller]]></category>
		<category><![CDATA[nano]]></category>
		<category><![CDATA[platine]]></category>
		<category><![CDATA[programmierung]]></category>
		<category><![CDATA[prozessor]]></category>
		<category><![CDATA[rfid]]></category>
		<category><![CDATA[scan]]></category>
		<category><![CDATA[scanner]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[tool]]></category>
		<category><![CDATA[uno]]></category>
		<guid isPermaLink="false">https://robbelroot.de/?p=10239</guid>

					<description><![CDATA[<p>Eigener Arduino RFID Scanner Im heutigen Beitrag erstellen wir einen eigenen Arduino RFID Scanner, Welcher die UIDs der gängigen Chipkarten / Tags auslesen kann. Damit können wir die jeweiligen Tags identifizieren und verschiedene Dinge, wie z. B. Zugriffskontrollen realisieren. Im einem der letzten Beiträge haben wir uns schon die Verarbeitung &#8230;</p>
<p>Der Beitrag <a href="https://robbelroot.de/blog/chipkarten-tags-mit-arduino-rfid-scanner-auslesen/">Chipkarten / Tags mit Arduino RFID Scanner auslesen</a> erschien zuerst auf <a href="https://robbelroot.de">Robert Skibbe</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image size-full"><a href="https://robbelroot.de/wp-content/uploads/2022/06/Arduino-RFID-Scanner-Chipkarten-Tags-scannen.png"><img loading="lazy" decoding="async" width="640" height="360" src="https://robbelroot.de/wp-content/uploads/2022/06/Arduino-RFID-Scanner-Chipkarten-Tags-scannen.png" alt="Arduino RFID Scanner - Chipkarten Tags scannen" class="wp-image-10244" title="Arduino RFID Scanner - Chipkarten Tags scannen"/></a><figcaption>Arduino RFID Scanner &#8211; Chipkarten Tags scannen</figcaption></figure>






<h2 class="wp-block-heading">Eigener Arduino RFID Scanner</h2>



<p>Im heutigen Beitrag erstellen wir einen eigenen Arduino RFID Scanner, Welcher die UIDs der gängigen Chipkarten / Tags auslesen kann. Damit können wir die jeweiligen Tags identifizieren und verschiedene Dinge, wie z. B. Zugriffskontrollen realisieren. Im einem der letzten Beiträge haben wir uns schon die Verarbeitung seitens einer .NET Programmiersprache wie C# / VB.NET angesehen.</p>



<p>Dort lag der Fokus eher auf der Verarbeitung der Signale, bzw. Daten der fertigen Hardware. Wir hatten die Lötarbeiten inkl. der Mikrocontroller-Software also schon mehr oder weniger vorausgesetzt. Heute werden wir die andere Seite beleuchten, also die Programmierung der passenden Software seitens unseres Arduino Mikrocontrollers.</p>



<p>Obwohl ich selbst jetzt nicht gerade der Profi-Elektroniker (sondern Entwickler &#x1f61b;) bin, bekommen wir das mit den Lötarbeiten am Arduino RFID Scanner schon hin. Zum Glück handelt es sich hierbei auch um eine ziemliche einfache Verbindung, wo wir nicht großartig rätseln müssen – &#x1f4aa;!</p>



<p class="info-banner">&#x1f4a1; Bei den einzelnen Produkt-Links handelt es sich ggf. um sogenannte Affiliate-Links. Wenn Du einen Artikel über einen jeweiligen Link erwirbst, bedankst Du Dich völlig ohne extra Kosten bei mir, indem ich einen geringen Anteil des Kaufbetrages bekomme. Falls Du das nicht möchtest, kannst Du die Artikel natürlich auch ohne meine Links suchen und kaufen.</p>



<style>
.info-banner {
  background: #03a9f4;
  padding: 2em;
  border-radius: 0.5em;
  color: whitesmoke;
}
table img {
  display: inline-block;
}
table tbody tr td:nth-child(2) {
  vertical-align: middle;
  text-align: left;
  padding-left: 1em;
  width: 80%;
}
</style>



<h2 class="wp-block-heading">Benötigtes Zubehör</h2>



<p>Schauen wir uns zuerst einmal an, Welches hardwaremäßige Zubehör für die Umsetzung unseres RFID Scanners benötigen. Auch wenn der Code natürlich auch erstmal so auf einem Arduino Nano, etc. laufen sollte, wird die Scan-Funktionalität natürlich nur mit dem passenden RFID-Modul funktionieren. Hier eine kleine Liste der benötigten Dinge.</p>



<figure class="wp-block-table is-style-regular"><table><tbody><tr><td class="has-text-align-right" data-align="right"><a href="https://amzn.to/3NQAaeA" target="_blank" rel="noreferrer noopener"><img loading="lazy" decoding="async" width="100" height="67" class="wp-image-10255" style="width: 100px;" src="https://robbelroot.de/wp-content/uploads/2022/06/Arduino-Nano.jpg" alt="Arduino Nano"></a></td><td><strong><a href="https://amzn.to/3NQAaeA" target="_blank" rel="noreferrer noopener">Arduino Nano</a></strong></td></tr><tr><td class="has-text-align-right" data-align="right"><a href="https://amzn.to/3xKIA1C" target="_blank" rel="noreferrer noopener"><img loading="lazy" decoding="async" width="100" height="100" class="wp-image-10272" style="width: 100px;" src="https://robbelroot.de/wp-content/uploads/2022/06/Arduino-RFID-Kit.jpg" alt="Arduino RFID Kit"></a></td><td><strong><a href="https://amzn.to/3xKIA1C" target="_blank" rel="noreferrer noopener">RFID Kit</a></strong></td></tr><tr><td class="has-text-align-right" data-align="right"><a href="https://amzn.to/3tzrlO9" target="_blank" rel="noreferrer noopener"><img loading="lazy" decoding="async" width="100" height="105" class="wp-image-10279" style="width: 100px;" src="https://robbelroot.de/wp-content/uploads/2022/06/Arduino-RFID-Scanner-Jumper-Kabel.jpg" alt="Arduino RFID Scanner - Jumper Kabel"></a></td><td><strong><a href="https://amzn.to/3tzrlO9" target="_blank" rel="noreferrer noopener">Jumper Kabel</a></strong></td></tr></tbody></table><figcaption>Benötigte Teile für den Arduino RFID Scanner</figcaption></figure>



<h3 class="wp-block-heading">Arduino Nano – der Mikrocontroller</h3>



<p>Als erstes Teil benötigst Du die Kernkomponente des Ganzen: Den Mikrocontroller. Ich persönlich habe mir damals ein Multi-Pack gekauft, da ich es als blödsinnig empfand, für einen einzigen Arduino Lieferkosten zu zahlen. Daher habe ich auch hier direkt das 3er Paket verlinkt. Achte bei Deinem Kauf darauf, dass passende USB-Kabel dabei sind!</p>



<h3 class="wp-block-heading">RFID Kit</h3>



<p>Der nächste Punkt auf unserer Shopping-Liste wäre das typische RFID-Kit. Hier ist alles dabei was wir brauchen. Einerseits haben wir verschiedene scanbare Tags und das Wichtigste: Unser Arduino RFID Modul.</p>



<h3 class="wp-block-heading">Jumper Kabel</h3>



<p>Im letzten Schritt müssen wir alles natürlich auch gut miteinander verbinden können. Dazu habe ich einen Mix aus verschiedenen Jumper-Kabeln ausgesucht. In unserem Beispiel (je nachdem was Du sonst da hast, oder gekauft hast) benötigen wir eigentlich nur &#8222;Female to Female&#8220; Kabel. Beachte hierzu auch noch den Hinweis unten drunter!</p>



<p class="info-banner">&#x26a0;&#xfe0f; Achte beim Kauf darauf, ob Du gewillt bist, selbst zu löten. Falls Du nicht selbst löten möchtest, kannst Du am besten schon fertig verlötete Geräte kaufen. Meistens geben die Verkäufer diese Info im Verkaufsangebot an. Frag im Zweifelsfall nach!</p>



<h2 class="wp-block-heading">Löt- &amp; Verbindungsarbeiten am Arduino RFID Scanner</h2>



<p>Um Deinen Arduino RFID Scanner soweit für die aktive Arbeit an der Software vorzubereiten, müssen wir Diesen nun im nächsten Schritt erstmal herrichten. Genauer genommen geht es jetzt an die kleinen Lötarbeiten, Welche zu verrichten wären. Ich werde Dir einmal ein Bild von der fertigen Hardware präsentieren und andererseits mit Text auf die Sprünge helfen.</p>



<h3 class="wp-block-heading">Die Verbindung – tabellarische Übersicht</h3>



<p>Hier findest Du einen tabellarischen Überblick über die Verbindung mit dem RFID-Kit RC522. Einerseits haben wir die typisch notwendigen Dinge wie den Stromkreislauf (GND = Ground = Masse, Spannung 3,3V), andererseits Signale auf den digitalen Pins, sowie einen ausgelassenen Anschluss.</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-center" data-align="center">Arduino</th><th class="has-text-align-center" data-align="center">RFID RC522</th></tr></thead><tbody><tr><td class="has-text-align-center" data-align="center">D10</td><td class="has-text-align-center" data-align="center">SDA</td></tr><tr><td class="has-text-align-center" data-align="center">D13</td><td class="has-text-align-center" data-align="center">SCK</td></tr><tr><td class="has-text-align-center" data-align="center">D11</td><td class="has-text-align-center" data-align="center">MOSI</td></tr><tr><td class="has-text-align-center" data-align="center">D12</td><td class="has-text-align-center" data-align="center">MISO</td></tr><tr><td class="has-text-align-center" data-align="center">/</td><td class="has-text-align-center" data-align="center">IRQ</td></tr><tr><td class="has-text-align-center" data-align="center">GND</td><td class="has-text-align-center" data-align="center">GND</td></tr><tr><td class="has-text-align-center" data-align="center">D9</td><td class="has-text-align-center" data-align="center">RST</td></tr><tr><td class="has-text-align-center" data-align="center">3,3V</td><td class="has-text-align-center" data-align="center">3,3V</td></tr></tbody></table><figcaption>Arduino zu RFID-Kit RC522 tabellarische Verbindungsübersicht</figcaption></figure>



<h3 class="wp-block-heading">Die fertige Hardware – als Bild</h3>



<p>Hier siehst Du die oben beschriebenen Verbindungen als fertiges Bild, leider nicht annähernd so toll, wie ein visueller Schaltplan, aber &#8222;It&#8217;s something&#8220;&#8230; Im Endeffekt soll&#8217;s nur einmal zeigen, wie es fertig aussieht, die Pinbelegungen sind hier leider weniger zu erkennen – sorry dafür.</p>



<figure class="wp-block-image size-full"><a href="https://robbelroot.de/wp-content/uploads/2022/06/Arduino-RFID-Scanner-Fertig-verloetet.jpg"><img loading="lazy" decoding="async" width="640" height="480" src="https://robbelroot.de/wp-content/uploads/2022/06/Arduino-RFID-Scanner-Fertig-verloetet.jpg" alt="Arduino RFID Scanner - Fertig verlötet" class="wp-image-10304" title="Arduino RFID Scanner - Fertig verlötet"/></a><figcaption>Arduino RFID Scanner &#8211; Fertig verlötet</figcaption></figure>



<h2 class="wp-block-heading">Die Hardware mit dem PC verbinden</h2>



<p>Im nächsten Schritt werde ich ein wenig darauf eingehen, wie Du Deinen nun fertigen Arduino RFID Scanner mit Deinem PC verbinden kannst. Wenn Du das bereits geschafft hast, Glückwunsch &#8211; Du kannst Diesen Teil hier überspringen. Falls nicht, fahren wir zuerst mit dem Download des Treibers für den CH340 Chip fort.</p>



<p>Besuche also als nächstes die <strong><a href="http://www.wch.cn/download/CH341SER_ZIP.html" target="_blank" rel="noreferrer noopener">Homepage für den Treiber</a></strong>, Welche leider in chinesisch ist. Verwende falls nötig / falls hilfreich z. B. die Übersetzungs-Funktion eines jeden modernen Browsers. Falls Du eine detailliertere Anleitung benötigst, kannst Du auch <strong><a href="https://robbelroot.de/blog/vbnet-rfid-scanner-chips-mit-arduinomikrocontroller-auslesen/" target="_blank" rel="noreferrer noopener">zum anderen Teil</a></strong> dieses zweiteiligen Beitrages gehen.</p>



<p>Kurzum würde ich sagen, installiere den Treiber, starte Deinen PC am besten einmal neu und schon bist Du für die Verbindung über Mini-USB ready. Falls Du nicht weiter kommst, gehe wie gesagt einmal zum anderen Teil und schaue Dir dort die bessere Anleitung hierzu an. Ich wollte es nur ungern wiederholen..</p>



<p>Wenn alles geklappt hat, solltest Du den angeschlossenen Arduino nun als verbundenen COM-Port sehen. Ein Beispiel findest Du hier in meinem Bild, dort ist der Arduino am Port &#8222;COM3&#8220; angeschlossen:</p>



<figure class="wp-block-image size-full"><a href="https://robbelroot.de/wp-content/uploads/2022/05/USB-Verbindung-vom-Arduino-CH340-Chip-erkannt.png"><img loading="lazy" decoding="async" width="785" height="208" src="https://robbelroot.de/wp-content/uploads/2022/05/USB-Verbindung-vom-Arduino-CH340-Chip-erkannt.png" alt="USB Verbindung vom Arduino CH340 Chip erkannt" class="wp-image-9969" title="USB Verbindung vom Arduino CH340 Chip erkannt"/></a><figcaption>USB Verbindung vom Arduino CH340 Chip erkannt</figcaption></figure>



<h2 class="wp-block-heading">Arduino RFID Code</h2>



<p>Kommen wir nun zum – für mich – interessantesten Teil: Der Code für unseren RFID Scanner aus der Arduino IDE! Zuerst fehlt noch eine Kleinigkeit, denn wir möchten den Code, der für die Kommunikation mit dem Gerät notwendig ist, mit Sicherheit nicht komplett von vorn, bzw. in Eigenarbeit schreiben.</p>



<p>Daher müssen wir nun zuerst einmal die Library / Bibliothek einbinden, Welche dafür notwendig ist und bereits fertig angeboten wird. Um es Dir so einfach wie möglich zu machen, habe ich Dir meine verwendete Version / Variante unten bei den Downloads hinzugefügt. Lade Dir die Datei herunter und im nächsten Schritt binden wir Diese auch sofort in unsere Arduino IDE ein.</p>



<h3 class="wp-block-heading">Library zur RFID Kommunikation einbinden</h3>



<p>Begebe Dich nach dem Download der unter Downloads gelisteten Library nun in die Arduino IDE. Dort klickst Du auf &#8222;Sketch-&gt;Bibliothek einbinden-&gt;.Zip-Bibliothek hinzufügen&#8220;. Dann zeigst Du dem Ding einfach die heruntergeladene Zip-Datei und fertig.</p>



<h3 class="wp-block-heading">Der Code selbst</h3>



<p>Nun fangen wir endlich mit unserem eigenen Code an, öffne dazu ein neues Arduino Projekt und speichere es z. B. als &#8222;RFID Beispiel&#8220; ab. Alternativ kannst Du natürlich in/mit der anderen unter Downloads angebotenen Projektdatei rumspielen.</p>



<p>Nachdem die Datei vorhanden ist und wir mit eigenem Code spielen können, binden wir zuerst einmal die notwendigen Bibliotheken ein. Die erste einzubindende Bibliothek ist die &#8222;SPI.h&#8220;-Datei, dann noch die &#8222;MFRC522.h&#8220;.</p>



<p>Wundere Dich nicht, wir haben die &#8222;SPI&#8220;-Bibliothek nicht heruntergeladen – brauchen wir auch nicht. Dabei handelt es sich um eine Standard-Bibliothek, Welche wir durch die Arduino IDE mitgeliefert bekommen.</p>



<h3 class="wp-block-heading">Imports usw</h3>



<pre class="EnlighterJSRAW" data-enlighter-language="c" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">#include &lt;SPI.h>
#include &lt;MFRC522.h></pre>



<p>Nach den Imports/Includes definieren wir nun 2 Konstanten für den SDA und den Reset Pin. Danach erstellen wir eine neue MFRC522-Instanz mit diesen beiden Konstanten als Parameter.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="c" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">#define SS_PIN 10
#define RST_PIN 9
MFRC522 mfrc522(SS_PIN, RST_PIN);</pre>



<h3 class="wp-block-heading">Setup-Funktion</h3>



<p>Nun versehen wir die Setup-Funktion des Arduino Codes mit Inhalt. Nicht vergessen, diese wird einmalig bei Start/Stromversorgung des Arduinos aufgerufen. In der ersten Zeile starten wir eine serielle Kommunikation mit der Baudrate von 9600. Danach sagen wir auch der SPI Lib &#8222;go&#8220;, Welche auch ihren Anteil dazu beiträgt. Zuletzt initialisieren wir den MFRC522 Chip, um damit zu interagieren.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="c" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">void setup() {
  Serial.begin(9600);
  SPI.begin();
  mfrc522.PCD_Init();
}</pre>



<h3 class="wp-block-heading">Haupt-Loop</h3>



<p>Im nächsten Schritt kommt die Haupt-Funktion des Arduino-Codes – die Haupt-Schleife. Dies ist der in einer Endlosschleife laufende Code, Welcher unsere Chips letztendlich verarbeitet. Die erste (If-) Anweisung prüft, ob eine neue Karte vorhanden ist. Danach wählen wir (laut Recherche der Funktion) die Karte aus. Verbessere mich hier gerne in den Kommentaren, falls Du es genauer weißt!</p>



<pre class="EnlighterJSRAW" data-enlighter-language="c" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">void loop() {
  if (!mfrc522.PICC_IsNewCardPresent())
    return;

  if (!mfrc522.PICC_ReadCardSerial())
    return;

  // more...
}</pre>



<h3 class="wp-block-heading">GetId-Funktion – Kleine Hilfe</h3>



<p>Als nächstes definieren wir uns eine Hilfs-Funktion, um die jeweilige Card-Id auszulesen. Diese geht in einer zähler- und kopfgesteuerten Schleife (for) die einzelnen Uid-Bytes durch (die Bytes der ID – anhand des &#8222;size&#8220; Wertes). Dabei setzen wir die ID aus der hex-repräsentativen Form zusammen. Solange wir nicht im letzten Block der UID-Blöcke angekommen sind, erweitern wir den String um ein Leerzeichen (sieht man gleich im Screenshot).</p>



<p>Zum Schluss wandeln wir dann alles noch in Großbuchstaben (wie für Hex-Werte üblich) um und geben es durch &#8222;return&#8220; wieder.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="c" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">String getCardId() {
  String uid = "";
  for (byte i = 0; i &lt; mfrc522.uid.size; i++)
  {
    uid.concat(String(mfrc522.uid.uidByte[i], HEX));
    if (i &lt; mfrc522.uid.size - 1)
      uid.concat(" ");
  }
  uid.toUpperCase();
  return uid;
}</pre>



<p>Zuletzt müssen wir die Funktion dementsprechend dann nur noch aufrufen und die bekommene ID verarbeiten. Mit der PICC_HaltA() Methode stoppen wir dann noch den Lesevorgang und verzögern das ganze Programm ein wenig – lasse die Verzögerung für Testzwecke gerne einmal weg.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="c" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">  String uid = getCardId();
  // Serial.println("RFID:" + uid);
  // do something with uid!
  mfrc522.PICC_HaltA();
  delay(1000);</pre>



<p>Hier habe ich beispielhaft mal 2 dieser typischen blauen Schlüsselanhänger-Chips und eine Chipkarte ausgelesen:</p>



<figure class="wp-block-image size-full"><a href="https://robbelroot.de/wp-content/uploads/2022/06/Arduino-RFID-Chipkarten-Anhaenger.jpg"><img loading="lazy" decoding="async" width="640" height="480" src="https://robbelroot.de/wp-content/uploads/2022/06/Arduino-RFID-Chipkarten-Anhaenger.jpg" alt="Arduino RFID Chipkarten Anhänger" class="wp-image-10362" title="Arduino RFID Chipkarten Anhänger"/></a><figcaption>Arduino RFID Chipkarten Anhänger</figcaption></figure>



<p>Dabei kamen dann die folgenden Werte heraus (nicht vergessen es bei Bedarf auszugeben, also mit Serial.println.. &#8211; ist oben auskommentiert). Strg+Shift+M öffnet den seriellen Monitor, um die Ausgabe des Arduinos zu beobachten. Hierbei muss man auch auf die korrekte Baudrate – in diesem Fall 9600 – achten.</p>



<figure class="wp-block-image size-full is-resized"><a href="https://robbelroot.de/wp-content/uploads/2022/06/Arduino-RFID-Scanner-3-Chip-UIDs-ausgelesen.png"><img loading="lazy" decoding="async" src="https://robbelroot.de/wp-content/uploads/2022/06/Arduino-RFID-Scanner-3-Chip-UIDs-ausgelesen.png" alt="Arduino RFID Scanner - 3 Chip UIDs ausgelesen" class="wp-image-10358" width="789" height="380" title="Arduino RFID Scanner - 3 Chip UIDs ausgelesen"/></a><figcaption>Arduino RFID Scanner &#8211; 3 Chip UIDs ausgelesen</figcaption></figure>



<h2 class="wp-block-heading">Kompletter Code</h2>



<p>Hier zeige ich am Ende nochmal den kompletten Arduino RFID Scanner Code:</p>



<pre class="EnlighterJSRAW" data-enlighter-language="c" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">#include &lt;SPI.h>
#include &lt;MFRC522.h>

#define SS_PIN 10
#define RST_PIN 9
MFRC522 mfrc522(SS_PIN, RST_PIN);

void setup() {
  Serial.begin(9600);
  SPI.begin();
  mfrc522.PCD_Init();
}

void loop() {
  if (!mfrc522.PICC_IsNewCardPresent())
    return;

  if (!mfrc522.PICC_ReadCardSerial())
    return;

  String uid = getCardId();
  
  Serial.println("RFID:" + uid);
  mfrc522.PICC_HaltA();
  delay(1000);
}

String getCardId() {
  String uid = "";
  for (byte i = 0; i &lt; mfrc522.uid.size; i++)
  {
    uid.concat(String(mfrc522.uid.uidByte[i], HEX));
    if (i &lt; mfrc522.uid.size - 1)
      uid.concat(" ");
  }
  uid.toUpperCase();
  return uid;
}</pre>



<h2 class="wp-block-heading">Fazit</h2>



<p>In diesem Beitrag habe ich demonstriert, wie man einen eigenen Arduino RFID Scanner bauen kann. Dazu brauchten wir im ersten Schritt einen Arduino Mikrocontroller und das RFID Kit mit ein wenig Zubehör, wie einigen Jumper Kabeln. Zusätzlich brauchten wir die passende Klassenbibliothek, Welche Du unten unter Downloads herunterladen kannst. Nachdem wir dann alles im Setup vorbereiteten, haben wir mit einigen Funktionen der Library inkl. einer kleinen selbstgebauten Funktion die UID des jeweiligen Tags ausgelesen. Wenn Du wissen möchtest, wie Du diese Informationen nun in z. B. C# oder VB.NET verarbeiten kannst, schaue gerne in den unten aufgelisteten RFID Beitrag.</p>



<h2 class="wp-block-heading">Weitere Links</h2>



<ul class="wp-block-list"><li><a href="https://robbelroot.de/blog/vbnet-rfid-scanner-chips-mit-arduinomikrocontroller-auslesen/" target="_blank" rel="noreferrer noopener"><strong>VB.NET RFID Chips mit Arduino auslesen</strong></a></li><li><a href="https://robbelroot.de/blog/virtuelle-com-ports-mit-com0com-erstellen-emulieren/"><strong>Virtuelle COM Ports emulieren mit com0com</strong></a></li></ul>



<h2 class="wp-block-heading">Downloads</h2>



<div class="wp-block-buttons is-layout-flex wp-block-buttons-is-layout-flex">
<div class="wp-block-button"><a class="wp-block-button__link" href="https://bit.ly/arduino-rfid-lib-download" target="_blank" rel="noreferrer noopener">arduino-rfid-lib.zip</a></div>



<div class="wp-block-button"><a class="wp-block-button__link" href="https://bit.ly/arduino-rfid-scanner-download" target="_blank" rel="noreferrer noopener">arduino-rfid.zip</a></div>
</div>
<p>Der Beitrag <a href="https://robbelroot.de/blog/chipkarten-tags-mit-arduino-rfid-scanner-auslesen/">Chipkarten / Tags mit Arduino RFID Scanner auslesen</a> erschien zuerst auf <a href="https://robbelroot.de">Robert Skibbe</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://robbelroot.de/blog/chipkarten-tags-mit-arduino-rfid-scanner-auslesen/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
	</channel>
</rss>
