Seite 1 von 2
Verknüpfungen [Gelöst]
Verfasst: 03.05.2009 17:35
von Tsuki-Namida
Hallo,
ich möchte verknüpfungen mit einer PB Anwendung erstellen...
ich habe natürlich die SuFu verwendet und bin auf ein thema gestosen wo dieser procedure verwendet wurde
http://www.purearea.net/pb/CodeArchiv/W ... ellLink.pb
wenn ich damit nun eine Verknüpfung erstelle funktioniert sie ja super aber das Programm was ich da verknüpfe arbeitet in verzeichnis der Verknüpfung nicht im verzeichnis der anwendung, zudem ist das icon auch nicht da egal welche icon nummer ich angebe
wenn ich die eigenschaft der verknüpfung aufrufe dan erhalt ich die fehlermeldung das, dass angegebene arbeitsverzeichnis nicht stimmt obwohl dies stimt....
Verfasst: 03.05.2009 17:42
von ts-soft
Hier mal eine überarbeitete und unicodetaugliche version:
Code: Alles auswählen
Procedure CreateShortcut(Path.s, Link.s, WorkingDir.s = "", Argument.s = "", ShowCommand.l = #SW_SHOWNORMAL, Description.s = "", HotKey.l = #Null, IconFile.s = "|", IconIndex.l = 0)
Protected psl.IShellLinkW, ppf.IPersistFile, mem.s, hres.l, Result.l
If IconFile = "|" : IconFile = Path : EndIf
If Not WorkingDir : WorkingDir = GetPathPart(Path) : EndIf
CoInitialize_(0)
If CoCreateInstance_(?CLSID_ShellLink, 0, 1, ?IID_IShellLink, @psl.IShellLinkW) = 0
Set_ShellLink_preferences:
psl\SetPath(@Path)
psl\SetArguments(@Argument)
psl\SetWorkingDirectory(@WorkingDir)
psl\SetDescription(@DESCRIPTION)
psl\SetShowCmd(ShowCommand)
psl\SetHotkey(HotKey)
psl\SetIconLocation(@IconFile, IconIndex)
ShellLink_SAVE:
If psl\QueryInterface(?IID_IPersistFile, @ppf.IPersistFile) = 0
mem.s = Space(1000)
PokeS(@mem, LINK, -1, #PB_Unicode)
hres = ppf\Save(@mem, #True)
result = 1
ppf\Release()
EndIf
psl\Release()
EndIf
CoUninitialize_()
ProcedureReturn result
DataSection
CLSID_ShellLink:
; 00021401-0000-0000-C000-000000000046
Data.l $00021401
Data.w $0000,$0000
Data.b $C0,$00,$00,$00,$00,$00,$00,$46
IID_IPersistFile:
; 0000010b-0000-0000-C000-000000000046
Data.l $0000010B
Data.w $0000,$0000
Data.b $C0,$00,$00,$00,$00,$00,$00,$46
CompilerIf #PB_Compiler_Unicode = 0
IID_IShellLink:
; DEFINE_SHLGUID(IID_IShellLinkA, 0x000214EEL, 0, 0);
; C000-000000000046
Data.l $000214EE
Data.w $0000,$0000
Data.b $C0,$00,$00,$00,$00,$00,$00,$46
CompilerElse
IID_IShellLink: ; {000214F9-0000-0000-C000-000000000046}
Data.l $000214F9
Data.w $0000, $0000
Data.b $C0, $00, $00, $00, $00, $00, $00, $46
CompilerEndIf
EndDataSection
EndProcedure
Die ersten zwei Parameter sind Pflicht, der rest stimmt automatisch, in
den meisten Fällen.
Verfasst: 03.05.2009 17:47
von Tsuki-Namida
juhu!
supi das klapt vielen lieben dank
Re: Verknüpfungen [Gelöst]
Verfasst: 12.04.2010 10:20
von broozar
hi, brauche genau diesen codeschnipsel, leider funktioniert er bei mir nicht mehr.
SetPath wirft einen fehler ("benötigt string"), obwohl ja ein string definiert ist. ersetzten von .s zu $ bringt keine besserung. bitte um hilfe!
Re: Verknüpfungen [Gelöst]
Verfasst: 12.04.2010 11:05
von DarkDragon
broozar hat geschrieben:hi, brauche genau diesen codeschnipsel, leider funktioniert er bei mir nicht mehr.
SetPath wirft einen fehler ("benötigt string"), obwohl ja ein string definiert ist. ersetzten von .s zu $ bringt keine besserung. bitte um hilfe!
Ich habs dir mal überarbeitet:
Code: Alles auswählen
Procedure CreateShortcut(Path.s, Link.s, WorkingDir.s = "", Argument.s = "", ShowCommand.l = #SW_SHOWNORMAL, Description.s = "", HotKey.l = #Null, IconFile.s = "|", IconIndex.l = 0)
Protected psl.IShellLinkW, ppf.IPersistFile, Result.i
If IconFile = "|" : IconFile = Path : EndIf
If Not WorkingDir : WorkingDir = GetPathPart(Path) : EndIf
CoInitialize_(0)
If CoCreateInstance_(?CLSID_ShellLink, 0, 1, ?IID_IShellLink, @psl.IShellLinkW) = 0
Set_ShellLink_preferences:
psl\SetPath(Path)
psl\SetArguments(Argument)
psl\SetWorkingDirectory(WorkingDir)
psl\SetDescription(DESCRIPTION)
psl\SetShowCmd(ShowCommand)
psl\SetHotkey(HotKey)
psl\SetIconLocation(IconFile, IconIndex)
ShellLink_SAVE:
If psl\QueryInterface(?IID_IPersistFile, @ppf.IPersistFile) = 0
If ppf\Save(Link, #True) = #S_OK
Result = 1
EndIf
ppf\Release()
EndIf
psl\Release()
EndIf
CoUninitialize_()
ProcedureReturn result
DataSection
CLSID_ShellLink:
; 00021401-0000-0000-C000-000000000046
Data.l $00021401
Data.w $0000,$0000
Data.b $C0,$00,$00,$00,$00,$00,$00,$46
IID_IPersistFile:
; 0000010b-0000-0000-C000-000000000046
Data.l $0000010B
Data.w $0000,$0000
Data.b $C0,$00,$00,$00,$00,$00,$00,$46
CompilerIf #PB_Compiler_Unicode = 0
IID_IShellLink:
; DEFINE_SHLGUID(IID_IShellLinkA, 0x000214EEL, 0, 0);
; C000-000000000046
Data.l $000214EE
Data.w $0000,$0000
Data.b $C0,$00,$00,$00,$00,$00,$00,$46
CompilerElse
IID_IShellLink: ; {000214F9-0000-0000-C000-000000000046}
Data.l $000214F9
Data.w $0000, $0000
Data.b $C0, $00, $00, $00, $00, $00, $00, $46
CompilerEndIf
EndDataSection
EndProcedure
Re: Verknüpfungen [Gelöst]
Verfasst: 12.04.2010 12:53
von broozar
vielen dank, läuft aber noch nicht.
SetDescription verlangt wohl eine number statt einem string und und nach auskommentieren dieser zeile gibt save einen ähnlichen fehler aus.
ich würd den code auch gern verstehen, habe aber keine ahnung, was psl und ppf sind...
Re: Verknüpfungen [Gelöst]
Verfasst: 12.04.2010 13:11
von DarkDragon
broozar hat geschrieben:vielen dank, läuft aber noch nicht.
SetDescription verlangt wohl eine number statt einem string und und nach auskommentieren dieser zeile gibt save einen ähnlichen fehler aus.
ich würd den code auch gern verstehen, habe aber keine ahnung, was psl und ppf sind...
Hast du PB 4.50 Beta 1 oder Beta 2? Ich hab Beta 2 und bei mir läufts. psl und ppf sind Objekte, die die Interfaces IShellLinkW und IPersistFile implementieren.
Re: Verknüpfungen [Gelöst]
Verfasst: 12.04.2010 13:16
von broozar
nein, die stable 4.41, diesmal auf meinem win7-starter netbook, also nicht win2k wie in meiner sig angegeben.
Re: Verknüpfungen [Gelöst]
Verfasst: 12.04.2010 13:53
von DarkDragon
Probiers mit der Beta, damit gehts. Ansonsten nimm den Originalquelltext und lösche bei allen Befehlen bei denen der Fehler auftritt einfach das @ bzw füge eins hinzu.
Re: Verknüpfungen [Gelöst]
Verfasst: 12.04.2010 14:01
von ts-soft
Try & Error ist aber eigentlich nicht notwendig. Die Ide hat einen Struktur-Viewer,
überall wo dort p-unicode steht kommt der String hin, ansonsten der Pointer!
Gruß
Thomas
So ist es in PB 4.50 definiert:
Code: Alles auswählen
Interface IShellLinkW
QueryInterface(a, b)
AddRef()
Release()
GetPath(a.i, b, c, d)
GetIDList(a)
SetIDList(a)
GetDescription(a.i, b)
SetDescription(a.p-unicode)
GetWorkingDirectory(a.i, b)
SetWorkingDirectory(a.p-unicode)
GetArguments(a.i, b)
SetArguments(a.p-unicode)
GetHotkey(a)
SetHotkey(a)
GetShowCmd(a)
SetShowCmd(a)
GetIconLocation(a.i, b, c)
SetIconLocation(a.p-unicode, b)
SetRelativePath(a.p-unicode, b)
Resolve(a, b)
SetPath(a.p-unicode)
EndInterface
PS: Wäre nett, wenn der Thread-Ersteller das Poster in seiner Signature entfernt oder verkleinert.
Auch das ändern des Usernamens ändert nichts daran, das so grosse Bilder störend wirken.