![]() |
Anzeige:
|
|
|||||||
| Spezielles Für die Bereiche API, Subclassing, Inline-Assembler, Prozesse, ect. |
|
![]() |
|
|
LinkBack | Themen-Optionen | Ansicht |
|
|
#1 (Direktlink) |
|
Super-Moderator
![]() Registriert seit: 15.02.2009
Beiträge: 10.786
|
Ich benutze in etwa folgenden Code, um die Dateien auszulesen, auf die Verknüpfungen verweisen.
Code:
'Definitionen
DEF MultiByteToWideChar(6) ! "Kernel32","MultiByteToWideChar"
DEF CoInitialize(1) ! "OLE32","CoInitialize"
DEF CoUnInitialize(0) ! "OLE32","CoUninitialize"
DEF CoCreateInstance(5) ! "OLE32","CoCreateInstance"
Def Shgetpathfromidlist(2) !"SHELL32","SHGetPathFromIDListA"
Def Shgetspecialfolderlocation(3) !"SHELL32","SHGetSpecialFolderLocation"
'Konstanten
DEF &PShell_Release 8
DEF &PShell_GetPath 12
DEF &PShell_Resolve 76
DEF &PFile_Release 8
DEF &PFile_Save 24
DEF &PFile_Load 20
DEF &Papierkorb $A
DEF &Control_Panel $3
DEF &DESKTOP $0
DEF &DESKTOPDIRECTORY $10
DEF &My_Computer $11
DEF &FONTS $14
DEF &Netzwerkumgebung $13
DEF &NETZWERK $12
DEF &EIGENE_DATEIEN $5
DEF &Drucker $4
DEF &Startmenü_Programme $2
DEF &Letzte_Dokumente $8
DEF &SENDTO $9
DEF &STARTMENU $B
DEF &Autostart $7
DEF &TEMPLATES $15
'globale Variablen
Declare CLSID_IShellLink#
Declare IID_IShellLink#
Declare IID_IPersistFile#
Declare FindData#
Declare Counter&
Declare SL$, SSS$, DesktopPath$, Verkn$, Autostart$
Proc GetLinkPath
Parameters LNK$
Declare Command&,Buffer$,PFile&
Declare Pshell&
Declare WideFile$
Dim FindData#,320
Dim CLSID_IShellLink#,16
Long CLSID_IShellLink#,0 = $00021401
Word CLSID_IShellLink#,4 = $0000
Word CLSID_IShellLink#,6 = $0000
Byte CLSID_IShellLink#,8 = $C0
Byte CLSID_IShellLink#,9 = $00
Byte CLSID_IShellLink#,10 = $00
Byte CLSID_IShellLink#,11 = $00
Byte CLSID_IShellLink#,12 = $00
Byte CLSID_IShellLink#,13 = $00
Byte CLSID_IShellLink#,14 = $00
Byte CLSID_IShellLink#,15 = $46
'
Dim IID_IShellLink#,16
Long IID_IShellLink#,0 = $000214EE
Word IID_IShellLink#,4 = $0000
Word IID_IShellLink#,6 = $0000
Byte IID_IShellLink#,8 = $C0
Byte IID_IShellLink#,9 = $00
Byte IID_IShellLink#,10 = $00
Byte IID_IShellLink#,11 = $00
Byte IID_IShellLink#,12 = $00
Byte IID_IShellLink#,13 = $00
Byte IID_IShellLink#,14 = $00
Byte IID_IShellLink#,15 = $46
'
Dim IID_IPersistFile#,16
Long IID_IPersistFile#,0 = $0000010b
Word IID_IPersistFile#,4 = $0000
Word IID_IPersistFile#,6 = $0000
Byte IID_IPersistFile#,8 = $C0
Byte IID_IPersistFile#,9 = $00
Byte IID_IPersistFile#,10 = $00
Byte IID_IPersistFile#,11 = $00
Byte IID_IPersistFile#,12 = $00
Byte IID_IPersistFile#,13 = $00
Byte IID_IPersistFile#,14 = $00
Byte IID_IPersistFile#,15 = $46
'
CoInitialize(0)
CoCreateInstance(CLSID_IShellLink#,0,1,IID_IShellLink#,Addr(PShell&))
Command& = Long(Pshell&,0)
CALL(LONG(COMMAND&,0),PShell&,IID_IPersistFile#,Addr(PFile&))'Interface ermitteln
WideFile$ = Space$(Len(LNK$)*2)
MultiByteToWideChar(0,1,addr(LNK$),-1,addr(WideFile$),Len(WideFile$))'LNK-File umwandeln
Command& = Long(PFile&,0)
CALL(LONG(COMMAND&,&PFile_Load),PFile&,Addr(WideFile$),1)'LinkFile laden
Command& = Long(Pshell&,0)
CALL(LONG(COMMAND&,&PShell_Resolve),PShell&,%hwnd,$3)
Buffer$ = Space$(260)
CALL(LONG(COMMAND&,&PShell_GetPath),PShell&,ADDR(Buffer$),260,FindData#,$1)'(Shortname)Pfad in Buffer$
CALL(LONG(COMMAND&,&PShell_Release),PShell&)
Command& = Long(PFile&,0)
CALL(LONG(COMMAND&,&PFile_Release),PFile&)
CoUnInitialize()
Dispose CLSID_IShellLink#
Dispose IID_IShellLink#
Dispose IID_IPersistFile#
Dispose FindData#
Return LongName$(Buffer$)
EndProc
Proc GetShellFolder
Parameters PRINT%,Folder&
Declare Itemid&, Result#, Retstr$,ERR&
Dim Result#, 261
Clear Result#
LET ERR&=Shgetspecialfolderlocation(%HWND,Folder&,@Addr(Itemid&))
CASE PRINT%=1 : PRINT "RUCKGABE von Shgetspecialfolderlocation="+@STR$(ERR&)
CASE ERR&=0 : LET Retstr$="Identifier wurde ermittelt, kein Pfad zu ermitteln..."
LET ERR&=Shgetpathfromidlist(Itemid&,Result#)
CASE PRINT%=1 : PRINT "RUCKGABE von Shgetpathfromidlist="+@STR$(ERR&)
IF String$(Result#,0)<>""
Retstr$ = String$(Result#,0)
endif
Dispose Result#
Return Retstr$
Endproc
Counter& = 1
ClearList
DesktopPath$ = GetShellFolder(0,&Desktop)
Autostart$ = GetShellFolder(0,&Autostart)
AddFiles DesktopPath$+"\"+"*.LNK"
SL$ = MoveListToStr$(";")
SSS$ = " "
ClearList
Whilenot SSS$ = ""
SSS$ = SUBSTR$(SL$,Counter&,";")
IF SSS$<>""
Verkn$ = GetLinkPath(DesktopPath$+"\"+SSS$)
Addstring DesktopPath$+"\"+SSS$+": "+Verkn$
Counter& = Counter& + 1
endif
Wend
ClearList
AddFiles Autostart$+"\"+"*.LNK"
SL$ = MoveListToStr$(";")
SSS$ = " "
ClearList
Whilenot SSS$ = ""
SSS$ = SUBSTR$(SL$,Counter&,";")
IF SSS$<>""
Verkn$ = GetLinkPath(Autostart$+"\"+SSS$)
Addstring Autostart$+"\"+SSS$+": "+Verkn$
Counter& = Counter& + 1
endif
Wend
Editbox("Verknüpfungen in "+DesktopPath$,1)
__________________
______________ Bitte Schnelltest durchführen: Neuer Virus, ahnungslose User seit Monaten infiziert! Mfg AHT |
|
|
|
|
|
|
#2 (Direktlink) |
|
Forenmaskottchen
![]() Registriert seit: 16.05.2010
Ort: Berlin
Beiträge: 724
|
Auf die Art kannste mit CSIDL_PROGRAM_FILESX86 den 32-bit Ordner
unabhängig Deiner Exe ermitteln, oder mit CSIDL_PROGRAM_FILES den Ordner, abhängig von Deiner Exe. Für Dein Vorhaben kannst Du nur mit "KNOWNFOLDERID" arbeiten: KNOWNFOLDERID (Windows) FOLDERID_ProgramFilesX64 bzw.GUID{6D809377-6AF0-444b-8957-A3773F02200E} entspricht Deinem Wunsch. Der Rest ist dann hier: Known Folders (Windows) nachzulesen. PS: Es macht recht wenig Sinn die Konstanten falsch zu benennen!
__________________
Gruß Thomas Wenn mir früher jemand gesagt hätte, ich würde freiwillig eine Wanze mit mir herum tragen und sie auch noch selbst aufladen, hätte ich laut gelacht. Heute habe ich ein Smartphone. http://realsource.de |
|
|
|
|
|
#3 (Direktlink) |
|
Super-Moderator
![]() Registriert seit: 15.02.2009
Beiträge: 10.786
|
Und was mach ich mit dem "Knownfolder" dann genau, wenn ich den habe?
__________________
______________ Bitte Schnelltest durchführen: Neuer Virus, ahnungslose User seit Monaten infiziert! Mfg AHT |
|
|
|
|
|
#4 (Direktlink) |
|
Super-Moderator
![]() Registriert seit: 15.02.2009
Beiträge: 10.786
|
Problem ist, das mir Resolve beide Pfade, C:\Program Files (x86) und C:\Program Files auf den selben Pfad mappt, nämlich C:\Program Files (x86).
Wie und wo bekomme ich die CSIDL des Pfades? Resolve und GetPath springe ich da im Augenblick wohl an (wenn ich es richtig verstanden habe). Wie komme ich an was, das ich umwandeln kann? Bin da im Augenblick Blind.
__________________
______________ Bitte Schnelltest durchführen: Neuer Virus, ahnungslose User seit Monaten infiziert! Mfg AHT |
|
|
|
|
|
#5 (Direktlink) |
|
Forenmaskottchen
![]() Registriert seit: 16.05.2010
Ort: Berlin
Beiträge: 724
|
Es gibt keine CSIDL für 64-Bit für 32-Bit Anwendungen. Du sollst dafür
SHGetKnownFolderPath nutzen. PS: Unicode! Dient nur der korrekten Pfadermittlung. Die hab ich als das Problem verstanden. Ansonsten weiß ich nicht, was Dein Code warum macht, hab ich nicht getestet und sehe ich keinen nutzen für mich. Auf der MSDN Seite wirste wohl alleine weiterlesen müssen.
__________________
Gruß Thomas Wenn mir früher jemand gesagt hätte, ich würde freiwillig eine Wanze mit mir herum tragen und sie auch noch selbst aufladen, hätte ich laut gelacht. Heute habe ich ein Smartphone. http://realsource.de |
|
|
|
|
|
|
#6 (Direktlink) |
|
Super-Moderator
![]() Registriert seit: 15.02.2009
Beiträge: 10.786
|
Na ja - den korrekten Program Files Pfad zu ermitteln, ist auf jeden Fall nicht das Problem. Das Problem ist, dass mir dieses COM Objekt den falschen Pfad zur Datei liefert, mit dem die Verlinkung verknüpft ist. Der müsste eigentlich C:\Program Files sein, zurückgeliefert wird aber C:\Program Files (X86) - das wird aber auch zurückgeliefert, wenn der korrekte Pfad C:\Program Files (X86) ist.
Meine Frage ist also, ob das COM Objekt (das Problem taucht bei anderen COM Objekten in ähnlicher Weise auch auf) unter X64 mit einem 32Bit Programm gar nicht korrekt funktionieren kann, oder ob ich was übersehen habe. PS: Wenn ich was übersehen habe, bitte so erklären, dass ein dummer Mensch wie ich das auch versteht.
__________________
______________ Bitte Schnelltest durchführen: Neuer Virus, ahnungslose User seit Monaten infiziert! Mfg AHT |
|
|
|
|
|
#7 (Direktlink) |
|
Gast
Beiträge: n/a
|
Schau mal hier, vielleicht hilft dir das weiter.
CSIDL (Windows) Du könntest auch die Environment Variablen auslesen |
|
|
|
#8 (Direktlink) |
|
Super-Moderator
![]() Registriert seit: 15.02.2009
Beiträge: 10.786
|
Wie gesagt - das ist nicht das Problem.
Bitte testet das mal selbst...
__________________
______________ Bitte Schnelltest durchführen: Neuer Virus, ahnungslose User seit Monaten infiziert! Mfg AHT |
|
|
|
|
|
#9 (Direktlink) |
|
Forenmaskottchen
![]() Registriert seit: 16.05.2010
Ort: Berlin
Beiträge: 724
|
Ich vermute mal, bzw. glaube fest, das ist nicht vorgesehen.
__________________
Gruß Thomas Wenn mir früher jemand gesagt hätte, ich würde freiwillig eine Wanze mit mir herum tragen und sie auch noch selbst aufladen, hätte ich laut gelacht. Heute habe ich ein Smartphone. http://realsource.de |
|
|
|
|
|
#10 (Direktlink) |
|
Super-Moderator
![]() Registriert seit: 15.02.2009
Beiträge: 10.786
|
Davon gehe ich auch aus. Ich werde das noch mit dem SYTEM32 / SYSWOW64 Ordner testen.
Kann eine böse Falle sein...
__________________
______________ Bitte Schnelltest durchführen: Neuer Virus, ahnungslose User seit Monaten infiziert! Mfg AHT |
|
|
|
|
![]() |
|
| Lesezeichen |
| Themen-Optionen | |
| Ansicht | |
|
|
Ähnliche Themen
|
||||
| Thema | Autor | Forum | Antworten | Letzter Beitrag |
| Verknüpfungen - xyz.exe.lnk | Thomas2010 | Windows 7 | 0 | 29.10.2010 17:08 |
| Kontrollkästchen-Verknüpfungen | vistaneuling | Office-Anwendungen | 0 | 23.01.2010 11:51 |
| Verknüpfungen | uncled | Windows XP | 1 | 16.02.2007 15:10 |
| Probleme mit Ink-VErknüpfungen | Junior | Windows XP | 33 | 19.09.2004 11:17 |
| Verknüpfungen Windows XP | aiping | Windows XP | 2 | 11.06.2004 00:26 |