Allgemeine Fragen zur PROFAN Programmierung
Views (Heute): 249527 (10963)
  Suchen
 Zurück zur Übersicht
 AutorThema: Windows Verknüpfung
M. Heinemann
Datum:09.08.01 10:12 Antwortenals Email verschicken (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 Antwortenals Email verschicken (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 Antwortenals Email verschicken (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 Antwortenals Email verschicken (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 Antwortenals Email verschicken (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 Antwortenals Email verschicken (mathias.heinemann@web.de) 


Jawoll, funzt. Dank Dír.



Roland G. Hülsmann
Datum:10.08.01 11:13 Antwortenals Email verschicken (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 Antwortenals Email verschicken (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 Antwortenals Email verschicken (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