Verknüpfungen [Gelöst]

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Tsuki-Namida
Beiträge: 633
Registriert: 17.11.2005 13:27
Kontaktdaten:

Verknüpfungen [Gelöst]

Beitrag 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....
Zuletzt geändert von Tsuki-Namida am 03.05.2009 17:47, insgesamt 1-mal geändert.
Bild
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Tsuki-Namida
Beiträge: 633
Registriert: 17.11.2005 13:27
Kontaktdaten:

Beitrag von Tsuki-Namida »

juhu!
supi das klapt vielen lieben dank
Bild
broozar
Beiträge: 97
Registriert: 08.03.2010 15:53
Wohnort: Berlin
Kontaktdaten:

Re: Verknüpfungen [Gelöst]

Beitrag 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!
iMac 27" quad i7 radeon 4850 8gig ram
PB 4.4 in parallelsVM @ 2 cores 3072megs ram 32megs vram win7
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Re: Verknüpfungen [Gelöst]

Beitrag 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
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
broozar
Beiträge: 97
Registriert: 08.03.2010 15:53
Wohnort: Berlin
Kontaktdaten:

Re: Verknüpfungen [Gelöst]

Beitrag 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...
iMac 27" quad i7 radeon 4850 8gig ram
PB 4.4 in parallelsVM @ 2 cores 3072megs ram 32megs vram win7
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Re: Verknüpfungen [Gelöst]

Beitrag 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.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
broozar
Beiträge: 97
Registriert: 08.03.2010 15:53
Wohnort: Berlin
Kontaktdaten:

Re: Verknüpfungen [Gelöst]

Beitrag von broozar »

nein, die stable 4.41, diesmal auf meinem win7-starter netbook, also nicht win2k wie in meiner sig angegeben.
iMac 27" quad i7 radeon 4850 8gig ram
PB 4.4 in parallelsVM @ 2 cores 3072megs ram 32megs vram win7
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Re: Verknüpfungen [Gelöst]

Beitrag 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.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Verknüpfungen [Gelöst]

Beitrag 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.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Antworten