Allgemeine Fragen zur PROFAN Programmierung

Views (Heute): 249527 (10963)

| Suchen
| Zurück zur Übersicht

Autor | Thema: Windows Verknüpfung
M. Heinemann
| Datum:09.08.01 10:12 (mathias.heinemann@web.de) |
Wie kann ich mit Profan eine Verknüpfung (*.lnk) unter Windows erstellen ?
Jörg Sellmeyer
| Datum:09.08.01 13:32 (joerse@gmx.de) |
Hallo Mathias, Thomas Hölzer hat in einer seiner letzten Aktionen diese Funktion für Profan zugänglich gemacht:
    ' PRFellow-Vorlage
    ' Autor: Thomas Hölzer - Alle Rechte vorbehalten
    ' IShellLink-Interface und IPersistFile-Interface
    ' Hier: Link-Files anlegen
    ' Benötigt Profan 7.0

    ' Die Fehlerbehandlung wurde der besseren Übersicht
    ' wegen mit Return-Sprüngen implementiert
    ' Im Fehlerfall wird -1 zurückgegeben,
    ' bei Erfolg den OLE-Konventionen entsprechend 0 (= NO_ERROR)

    ' Die Parameter für CreateLinkFile sind genau(!) einzuhalten:

    ' 1: Name mit Pfad der gewünschten Linkdatei (*.lnk)
    ' 2: Dateiname mit Pfad, der verlinkt werden soll
    ' 3: Arbeitsverzeichnis oder Leerstring
    ' 3: Start-Parameter oder Leerstring
    ' 4: Optional: Pfad der Datei, die das anzuzeigende Icon enthält oder Leerstring
    ' 5: Nullbasierter Index des gewünschten Icons
    ' 6: HotKey-Wert oder 0
    ' Weitere Hilfe: Suchwort IShellLink in OLE32.HLP
    ' oder im MSDN http://msdn.microsoft.com/default.asp
    ' Bei Suche beachten: IShellLink schreibt sich mit 3 L!

    Def CoInitialize(1) !"OLE32","CoInitialize"
    Def CoUnInitialize(0) !"OLE32","CoUninitialize"
    Def CoCreateInstance(5) !"OLE32","CoCreateInstance"
    Def CLSIDFromString(2) !"OLE32","CLSIDFromString"
    Def IIDFromString(2) !"OLE32","IIDFromString"
    Def MultiByteToWideChar(6) !"KERNEL32","MultiByteToWideChar"
    Def WideCharToMultiByte(8) !"KERNEL32","WideCharToMultiByte"
    Def Succeeded(1) Gt(&(1),-1)

    Declare CLSID_ShellLink$
    CLSID_ShellLink$ = "{00021401-0000-0000-C000-000000000046}"

    Declare SID_IShellLinkA$
    SID_IShellLinkA$= "{000214EE-0000-0000-C000-000000000046}"

    Declare IPersistFile$
    IPersistFile$="{0000010B-0000-0000-C000-000000000046}"

    Declare olestr#,clsid#,iid#
    Declare pshellink#,ppersistfile#,ipersistfile#
    Declare pislmethods#,pipfmethods#

    Proc CleanupIShL
     Dispose olestr#
     Dispose pislmethods#
     Dispose pipfmethods#
     Dispose ppersistfile#
     Dispose ipersistfile#
     Dispose pshellink#
     Dispose clsid#
     Dispose iid#
     CoUnInitialize()
    EndProc

    Proc CreateLinkFile
     Parameters linkfile$,file$,workdir$,params$,icofile$,icoidx&,hotkey&
     Declare result%

     ' COM initialisieren
     CaseNot Succeeded(CoInitialize(0)): Return -1

     Dim olestr#,261 ' muß für IPersistFile so groß sein (MAX_PATH+1)
     Dim clsid#,16
     Dim iid#,16
     Dim pshellink#,4
     Dim ipersistfile#,4
     Dim ppersistfile#,16
     Dim pislmethods#,84
     Dim pipfmethods#,36

     ' ClassID und IID für IShellLink holen
     Clear olestr#
     MultiByteToWideChar(1,1,Addr(CLSID_ShellLink$),Len(CLSID_ShellLink$),olestr#,261)

     IfNot Succeeded(CLSIDFromString(olestr#,CLSID#))
      CleanupIShL
      Return -1
     EndIf

     Clear olestr#
     MultiByteToWideChar(1,1,Addr(SID_IShellLinkA$),Len(SID_IShellLinkA$),olestr#,261)

     IfNot Succeeded(IIDFromString(olestr#,IID#))
      CleanupIShL
      Return -1
     EndIf

     ' COM-Objekt erzeugen und Zeiger auf IShellLink-Methoden-Tabelle

     IfNot Succeeded(CoCreateInstance(CLSID#,0,1,IID#,Addr(pshellink#)))
      CleanupIShL
      Return -1
     EndIf

     Let pislmethods# =Long(pshellink#,0)

     ' ClassID für IPersistFile holen
     Clear olestr#
     MultiByteToWideChar(1,1,Addr(IPersistFile$),Len(IPersistFile$),olestr#,261)

     IfNot Succeeded(IIDFromString(olestr#,ppersistfile#))
      CleanupIShL
      Return -1
     EndIf

     ' QueryInterface: IPersistFile-Zeiger holen und Zeiger auf Methoden

     IfNot Succeeded(Call(Long(pislmethods#,0),pshellink#,ppersistfile#,Addr(ipersistfile#)))
      CleanupIShL
      Return -1
     EndIf
     pipfmethods#=Long(ipersistfile#,0)

     ' Dateiname der Linkdatei in WideString konvertieren

     Clear olestr#
     IfNot Equ(MultiByteToWideChar(1,1,Addr(linkfile$),Len(linkfile$),olestr#,261),\
      Len(LinkFile$))
       CleanupIShL
       Return -1
     EndIf

     ' Das IShellLink-Methoden aufrufen
     '.SetWorkDir
     Call(Long(pislmethods#,36),pshellink#,Addr(workdir$))
     '.SetArguments
     Call(Long(pislmethods#,44),pshellink#,Addr(params$))
     '.SetHotKey
     Call(Long(pislmethods#,52),pshellink#,hotkey&)
     '.SetIconLocation
     Call(Long(pislmethods#,68),pshellink#,Addr(icofile$),icoidx&)
     '.SetPath
     Call(Long(pislmethods#,80),pshellink#,Addr(file$))

     ' IPersistFile.Save
     Call(Long(pipfmethods#,24),ipersistfile#,olestr#,1)

     ' Aufräumen
     Call(Long(pipfmethods#,8),ipersistfile#)
     result%=Succeeded(Call(Long(pislmethods#,8),pshellink#))
     CleanupIShL
     Return Not(result%)
    EndProc

    ' Beispiel

    Cls
    CreateLinkFile "C:\PRFTEST.LNK",Add$($WinPath,"\EXPLORER.EXE"),"C:\","","SHELL32.DLL",41,0
    If Equ(%(0),0)
     Print "OK"
    Else
     Print "Fehler"
    EndIf
    WaitInput
M. Heinemann
| Datum:09.08.01 14:10 (mathias.heinemann@web.de) |
Geht leider nicht. Problem mit folgender Zeile: CaseNot Succeeded(CoInitialize(0)): Return -1 Fehler: Befehl unbekannt. Hab aber Version 7 Kann mir irgend jemand helfen ?
Jörg Sellmeyer
| Datum:09.08.01 23:35 (joerse@gmx.de) |
Bei mir funktioniert es. Du mußt schon den gesamten Quelltext verwenden und deinen Bedürfnissen entsprechend anpassen. Einzelne Funktionen oder Befehle daraus funktionieren nicht ohne den Rest. Jörg
Sebastian Sprenger
| Datum:10.08.01 00:34 (prof.chaos@netcologne.de) |
Hallo Mathias, erscheint diese Fehlermeldung bei dir vielleicht im Compiler? Dort ist nämlich ein kleiner Fehler. Wenn ich diese Zeile durch Folgende ersetze:
    Case Not(Succeeded(CoInitialize(0))): Return -1
dann funktioniert es auch, obwohl es im Grunde das Gleiche ist. Sebastian
M. Heinemann
| Datum:10.08.01 07:57 (mathias.heinemann@web.de) |
Jawoll, funzt. Dank Dír.
Roland G. Hülsmann
| Datum:10.08.01 11:13 (rgh-soft@t-online.de) |
Ein kleiner Hinweis: Die Veröffentlichung von Quelltexten aus PrFellow widerspricht den Lizenzbestimmungen des Produktes und ist außerdem völlig überflüssig, da PrFellow als Freeware z.B. über den Freeware-Bereich meiner Homepage zum Download zur Verfügung steht. Auch Freeware hat Lizenzbestimmungen (das unterscheidet sie von Public Domain Software). Ein Hinweis auf die Vorlage hätte also völlig ausgereicht und macht zudem den Thread deutlich lesbarer. BTW 1: Das gilt prinzipiell für alle Quelltexte, die nicht aus eigener Feder stammen: Immer erst nachschauen, ob die jeweiligen Lizenzbestimmungen eine Veröffentlichung erlauben. In der Regel ist dies nämlich eingeschränkt! BTW 2: Auch bei eigenen Quellcodes dieser Größe ist in der Regel ein Link auf eine Downloadadresse angenehmer als ein seitenlanges Zitat hier im Forum. Außerdem ist die Kapazität des Forums nicht unbegrenzt!
Jörg Sellmeyer
| Datum:10.08.01 12:36 (joerse@gmx.de) |
Hallo, Meines Wissens ist dieser Quelltext nicht Bestandteil von PrFellow, da Thomas ihn erst kurz vor seinem Ausstieg veröffentlicht hat. Ich weiß nicht ob er im Download-Paket drin ist. Wenn nicht, wüßte ich nicht wie seine Tips - die er ja immerhin im Forum veröffentlicht hat - Anderen zugänglich gemacht werden sollen. Vielleicht muß das nochmal geklärt werden. Das mit der Kapazität ist natürlich ein schlagendes Argument. Viele Grüße Jörg
Roland G. Hülsmann
| Datum: 10.08.01 17:44 (rgh-soft@t-online.de) |
In diesem Fall ist es dann tatsächlich etwas anderes. Das gibt mir aber Gelegenheit darauf hinzuweisen, daß die Inhalte der vergangenen Foren (es gab ja schon mehrere) komplett im Downloadbereich meiner Homepage zum Download zur Verfügung stehen. Es gibt also keine Tips und Tricks, die verloren gegangen sind!

| Zurück zur Übersicht