Verknüpfung von eigenem Programm erstellen

  • VB.NET

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von asusdk.

    Verknüpfung von eigenem Programm erstellen

    Hallo an Alle,

    ich scheitere seit einigen Stunden an dem einfachen Porblem das ich einfach keine Verknüpfung von meinem (laufenden) Programm erstellen kann, die einzige (fast) funktionierende Möglichkeit die ich gefunden habe ist folgende:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Shared Sub CreateShortcut(ByVal SourceFile As String, ByVal TargetFolder As String, ByVal TargetFileName As String,
    2. Optional ByVal sArguments As String = "",
    3. Optional ByVal sWorkingDir As String = "")
    4. Dim TargetFile As String = TargetFolder & "\" & TargetFileName
    5. Try
    6. Dim oShell As New Shell32.Shell
    7. Dim oFolder As Shell32.Folder
    8. Dim oLink As Shell32.ShellLinkObject
    9. Dim sPath As String = SourceFile.Substring(0, SourceFile.LastIndexOf("\"))
    10. Dim sFile As String = SourceFile.Substring(SourceFile.LastIndexOf("\") + 1)
    11. Dim F As Integer = Microsoft.VisualBasic.FreeFile()
    12. Microsoft.VisualBasic.FileOpen(F, SourceFile, Microsoft.VisualBasic.OpenMode.Output)
    13. Microsoft.VisualBasic.FileClose(F)
    14. oFolder = oShell.NameSpace(sPath)
    15. oLink = CType(oFolder.Items.Item(sFile).GetLink, ShellLinkObject)
    16. With oLink
    17. If sArguments.Length > 0 Then .Arguments = sArguments
    18. If sWorkingDir.Length > 0 Then .WorkingDirectory = sWorkingDir
    19. .Path = TargetFile
    20. .Save()
    21. End With
    22. oLink = Nothing
    23. oFolder = Nothing
    24. oShell = Nothing
    25. Catch ex As Exception
    26. MessageBox.Show("Fehler bei Erstellung der Verknüpfung " & ex.ToString)
    27. End Try
    28. End Sub


    diese liefert mir jedoch einen Fehler, da mein Programm läuft, also kann man nicht auf den Prozess zugreifen...

    andernfalls hätte ich noch gefunden :

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Function MakeShortcut(ByVal File As String, ByVal ShortcutFolder As String, ByVal Name As String, ByVal WorkDirectory As String)
    2. Dim WshShell As Object = CreateObject("WScript.Shell")
    3. Dim NewShortcut As Object = WshShell.CreateShortcut(ShortcutFolder & "\" & Name & ".lnk")
    4. NewShortcut.TargetPath = File
    5. NewShortcut.WindowStyle = 1
    6. NewShortcut.IconLocation = File & ",0"
    7. NewShortcut.WorkingDirectory = WorkDirectory
    8. NewShortcut.Save()
    9. End Function

    das konnte ich leider nicht mal testen da Strict On irgendein spätes binden nicht zulassen will

    ich versteh leider nicht warum so was simples wie eine Verknüpfung so schwer zu erstellen ist...
    Weis evtl. jemand Rat ?

    Danke und Greets
    Wer anderen eine Bratwurst brät, der hat ein Bratwurst-bratgerät :D
    @asusdk Das wird so nicht gehen, denn nicht umsonst gibt es Installer, die genau dies mit einem anderen Programm tun.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    VB-Fragen über PN / Konversation werden ignoriert!
    Das wird so nicht gehen, denn nicht umsonst gibt es Installer, die genau dies mit einem anderen Programm tun.

    Das ist echt schade, ich mein eine Verknüpfung ist doch im prinzip nur ne Art Link, das man das so nicht kann ist wirklich richtig schade...
    Wer anderen eine Bratwurst brät, der hat ein Bratwurst-bratgerät :D
    Nun, wenn Du schon ne Variante hast, die funktioniert, könnte man ja dafür Option Strict mal auf Off machen. Oder die WSH-Com-Lib einbinden, damit Option Strict On wieder brav mitspielt, siehe MSDN-Thread, Antwort 1
    • meine wichtigste Programmiererkenntnis: Mühsam erhängt sich das Eichhörnchen.
    • eine häufig von mir verwendete Abkürzung: CEs = control elements (Labels, Buttons, DGVs, ...)
    • »Oh, großes Spaghetticodemonster. Bitte schicke mir Durchblick! Oder zumindest eine Gabel. Oder, wenn es kein Besteck mehr gibt, zumindest Glasnudeln.«
    @VaporiZed leider funktioniert die Lösung aus dem Link nicht da

    VB.NET-Quellcode

    1. IWshRuntimeLibrary


    Den Dienst verweigert da ich interop in meinem Project verwende

    das mit Strict Off test ich ma eben

    Edit: nein funktioniert leider genausowenig, weil createShortcut in Wshell anscheinend nicht existiert. Ist echt traurig das ein Grundfunktion aus Windows (rechtsklick verknüpfung erstellen) einfach nicht funktioniert...
    Wer anderen eine Bratwurst brät, der hat ein Bratwurst-bratgerät :D

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „asusdk“ ()

    Also mach einen Verweis(COM) auf windows script host object model
    Danach ist es damit getan:

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports IWshRuntimeLibrary
    3. Public Class Form1
    4. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    5. Dim wsh As New WshShell()
    6. Dim lnkFilename As String = Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + "\" + Application.ProductName + ".lnk"
    7. Dim lnk As IWshShortcut = DirectCast(wsh.CreateShortcut(lnkFilename), IWshShortcut)
    8. lnk.TargetPath = Application.ExecutablePath
    9. lnk.Save()
    10. End Sub
    11. End Class

    And i think to myself... what a wonderfuL World!
    Auch wenn Off-Topic: Hier stell ich mir wieder die Frage, wann das Forum n Rappel kriegt und HTML-Befehle "as is" anzeigt ...
    Oder spinnt mein Browser?
    Bilder
    • Forumsfehler.jpg

      83,26 kB, 720×450, 23 mal angesehen
    • meine wichtigste Programmiererkenntnis: Mühsam erhängt sich das Eichhörnchen.
    • eine häufig von mir verwendete Abkürzung: CEs = control elements (Labels, Buttons, DGVs, ...)
    • »Oh, großes Spaghetticodemonster. Bitte schicke mir Durchblick! Oder zumindest eine Gabel. Oder, wenn es kein Besteck mehr gibt, zumindest Glasnudeln.«
    @Eddy irgendwie versteh ich das grundlegende Problem nicht ganz denn mit deiner Lösung in Form von:

    VB.NET-Quellcode

    1. Public Shared Sub test()
    2. Dim wsh As New IWshRuntimeLibrary.WshShell()
    3. Dim lnkFilename As String = Environment.GetFolderPath(Environment.SpecialFolder.Desktop) & "\" & Application.ProductName & ".lnk"
    4. Dim lnk As IWshRuntimeLibrary.IWshShortcut = DirectCast(wsh.CreateShortcut(lnkFilename), IWshRuntimeLibrary.IWshShortcut)
    5. lnk.TargetPath = Application.ExecutablePath
    6. lnk.Save()
    7. End Sub


    funktioniert es, es wird eine Verknüpfung erstellt,

    mit folgendem Jedoch:

    VB.NET-Quellcode

    1. Public Shared Sub test2(ByVal SourceFile As String, ByVal TargetFolder As String, ByVal TargetFileName As String,
    2. Optional ByVal sArguments As String = "",
    3. Optional ByVal sWorkingDir As String = "")
    4. Dim wsh As New IWshRuntimeLibrary.WshShell()
    5. Dim InkFilename As String = TargetFolder & "\" & TargetFileName & ".Ink"
    6. Dim Ink As IWshRuntimeLibrary.IWshShortcut = DirectCast(wsh.CreateShortcut(InkFilename), IWshRuntimeLibrary.IWshShortcut)
    7. Ink.TargetPath = SourceFile
    8. Ink.Save()
    9. End Sub




    aufgerufen wurde mit :

    VB.NET-Quellcode

    1. External.test2(Application.ExecutablePath, fbdShortCutTarget.SelectedPath, "Anschreiben", "anschreiben")
    Bilder
    • Fail.JPG

      20,43 kB, 523×198, 56 mal angesehen
    Wer anderen eine Bratwurst brät, der hat ein Bratwurst-bratgerät :D
    uups, dachte bislang das es INK ist, aber ja mit LNK funktioniert es super =) Danke an alle Helfer !

    falls es jemand als Sub braucht hier noch die fertige Lösung :

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Sub CreateShortcut(ByVal SourceFile As String, ByVal TargetFolder As String, ByVal TargetFileName As String,
    2. Optional ByVal sArguments As String = "",
    3. Optional ByVal sWorkingDir As String = "",
    4. Optional ByVal sDescription As String = "",
    5. Optional ByVal sIconPath As String = "")
    6. Dim InkFilename As String = TargetFolder & "\" & TargetFileName & ".lnk"
    7. If Not IO.File.Exists(InkFilename) Then
    8. Dim wsh As New IWshRuntimeLibrary.WshShell()
    9. Dim Ink As IWshRuntimeLibrary.IWshShortcut = DirectCast(wsh.CreateShortcut(InkFilename), IWshRuntimeLibrary.IWshShortcut)
    10. Ink.TargetPath = SourceFile
    11. If sArguments.Length > 0 Then Ink.Arguments = sArguments
    12. If sWorkingDir.Length > 0 Then Ink.WorkingDirectory = sWorkingDir
    13. If sDescription.Length > 0 Then Ink.Description = sDescription
    14. If sIconPath.Length > 0 Then Ink.IconLocation = sIconPath
    15. Ink.Save()
    16. Else
    17. MessageBox.Show("Diese Verknüpfung existiert bereits!", "Info")
    18. End If
    19. End Sub


    Edit: Icon hinzugefügt
    Wer anderen eine Bratwurst brät, der hat ein Bratwurst-bratgerät :D

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „asusdk“ ()