une fonction de création de raccourcis voici le prototype C
extern "C" long __stdcall CreateLinkEx(
char * lpLinkPath,
char * lpTargetPath,
char * lpDescription,
char * lpCmdLine,
char * lpIconPath,
unsigned long ulIconIndex);
lpLinkPath : chemin complet ou relatif du raccourci
lpTargetPath : chemin complet du fichier référencé
lpDescription : description (peut être NULL)
lpCmdLine : ligne de commande passée au fichier référencé (peut être NULL)
lpIconPath : chemin complet de l'icone du raccourci
ulIconIndex : index de l'icône (ordre dans lequel une icône est déclarée dans le fichier resource script (.rc)) pour un fichier .ico ulIconPath doit avoir la valeur 0
voila c une chtite fonction tres simple pour montrer l'utilisation (primaire) de COM
un exemple d'utilisation en C (désolé, je n'ai aps le temps d'en réaliser un en ASM et j'ai celui en C sou la main) :
#include <ole2.h>
#include <shlobj.h>
#include <shlwapi.h>
extern "C" void __stdcall CreateLink(char *,char *,char *);
extern "C" void __stdcall CreateLinkEx(char *,char *,char *,char *,char *,int);
extern "C" int __stdcall main(void)
{
char lpDesktopFolder[MAX_PATH]; //définit une chaîne pour accueuillir le chemin du raccourci
CoInitialize(NULL); //initialise COM
SHGetSpecialFolderPath(NULL, //récupère le chemin du dossier "Bureau"
lpDesktopFolder,
0x10,
0);
PathAppend(lpDesktopFolder, //fusionne les deux chemins pour en faire un complet
"start.lnk");
CreateLinkEx(lpDesktopFolder, //crée le raccourci
"C:\\mes documents\\asm\\MSC\\start.exe",
"created with CreateLinkEx",
NULL,
"C:\\mes documents\\asm\\MSC\\start.ico",
0);
CoUninitialize(); //finit de travailler avec COM
return 0;
}
bon un exemple en ASM :
.386
assume cs:flat,ds:flat,ss:flat,es:flat,fs:nothing,gs:nothing
extrn CreateLinkEx@24:proc
data16 segment para public use16
lpLinkPath db "C:\mes documents\asm\MSC\start.lnk",0
lpTargetPath db "C:\mes documents\asm\MSC\start.exe",0
lpDescription db "created with CreateLinkEx",0
lpIconPath db "C:\mes documents\asm\MSC\start.ico",0
data16 ends
code16 segment para public use16
startup:
push 0 ;initialise COM
call CoInitialize
push 0 ;crée le raccourci
push offset lpIconPath
push 0
push offset lpDescription
push offset lpTargetPath
push offset lpLinkPath
call CreateLinkEx@24
call CoUninitialize ;finit de travailler avec COM
code16 ends
end startup
Source / Exemple :
;**************************************************************************
; exemple d'utilisation de COM sous MASM32 :
; fonction de création de raccourcis
;
; auteur : gblade
;
; description :
; Ce fichier implémente une fonction de création de raccourcis (fichiers
; link portant l'extention .lnk) via l'architecture COM de Microsoft.
; Les interfaces utilisées sont IShellLink et IPersistFile.
;**************************************************************************
.386 ;instructions du 386
option language:stdcall ;convention stdcall
assume cs:flat,ds:flat,ss:flat,es:flat,fs:flat,gs:flat ;model mémoire win32
include kernel32.inc ;header pour les fonctions de gestions de base
include ole32.inc ;header pour l'utilisation de COM
includelib kernel32.lib ;librairie pour les fonctions de gestions de base
includelib ole32.lib ;librairie pour l'utilisation de COM
includelib uuid.lib ;identificateurs GUID
;***** Importations *****
extrn IID_IPersistFile:dword
;***** Exportations *****
public CreateLink@12
public CreateLinkEx@24
;***** Constantes *****
CLSCTX_INPROC_SERVER equ 01h
;***** Données *****
data segment public
;----- Identificateurs -----
CLSID_ShellLink dd 00021401h
dw 00h,\
00h
db 0C0h,\
00h,\
00h,\
00h,\
00h,\
00h,\
00h,\
46h
IID_IShellLink dd 000214EEh
dw 00h,\
00h
db 0C0h,\
00h,\
00h,\
00h,\
00h,\
00h,\
00h,\
46h
data ends
;***** Code *****
text segment public
CreateLinkEx@24:
push 18h ;empile le nombre d'octets à dépiler en fin de fonction
jmp @f
CreateLink@12:
push 0ch ;empile le nombre d'octets à dépiler en fin de fonction
@@:
push ebp ;réserve la pile
mov ebp,esp
sub esp,10h ;réserve 8 octets de variables locales
push ebx ;sauve EBX pour utilisation future
lea eax,dword ptr [ebp-04h] ;crée une instance de l'objet IShellLink
push eax
push offset IID_IShellLink
push CLSCTX_INPROC_SERVER
push 0
push offset CLSID_ShellLink
call CoCreateInstance
test eax,eax
jnz createlink_end
mov ebx,dword ptr [ebp-04h] ;charge l'objet IShellLink en EBX
mov ecx,dword ptr [ebx] ;charge la VMT de l'objet IShellLink en ECX
push dword ptr [ebp+10h] ;change le chemin du fichier référencé
push ebx
call dword ptr [ecx+50h]
push dword ptr 0208h ;8 octets demandés
push 0 ;mémoire fixe demandée
call LocalAlloc
test eax,eax
jz createlink_release_ishelllink
mov dword ptr [ebp-0ch],eax ;charge la chaîne nouvellement obtenue dans une variable locale
lea eax,dword ptr [ebp-10h] ;récupère le chemin complet et le nom du fichier référencé
push eax
push [ebp-0ch]
push 0208h
push dword ptr [ebp+10h]
call GetFullPathName
mov ecx,dword ptr [ebp-10h] ;charge le nom du fichier en ECX
mov byte ptr [ecx-01h],0 ;retranche du chemin complet le nom du fichier
mov ecx,dword ptr [ebx] ;charge la VMT de l'objet IShellLink en ECX
push dword ptr [ebp-0ch] ;change le dossier d'exécution du fichier référencé
push ebx
call dword ptr [ecx+24h]
test eax,eax
jnz createlink_release_ipersistfile
mov ecx,dword ptr [ebx] ;charge la VMT de l'objet IShellLink en ECX
push dword ptr [ebp+14h] ;change la description du raccourci
push ebx
call dword ptr [ecx+1ch]
test eax,eax
jnz createlink_release_ipersistfile
cmp dword ptr [ebp+04h],18h
jnz @f
mov ecx,dword ptr [ebx] ;charge la VMT de l'objet IShellLink en ECX
push dword ptr [ebp+18h] ;change les arguments passés au fichier référencé
push ebx
call dword ptr [ecx+2ch]
test eax,eax
jnz createlink_release_ipersistfile
mov ecx,dword ptr [ebx] ;charge la VMT de l'objet IShellLink en ECX
push dword ptr [ebp+20h] ;change l'icône du raccourci
push dword ptr [ebp+1ch]
push ebx
call dword ptr [ecx+44h]
test eax,eax
jnz createlink_release_ipersistfile
@@:
test eax,eax
jnz createlink_end
mov ecx,dword ptr [ebx] ;charge la VMT de l'objet IShellLink en ECX
lea eax,dword ptr [ebp-08h] ;récupère une instance de l'objet IPersistFile
push eax
push offset IID_IPersistFile
push ebx
call dword ptr [ecx]
cmp eax,80004002h
jz createlink_release_ishelllink
push 0208h ;convertit la chaîne au format Unicode
push dword ptr [ebp-0ch]
push -1
push dword ptr [ebp+0ch]
push 0
push 0
call MultiByteToWideChar
test eax,eax
jz createlink_free
mov ebx,[ebp-08h] ;charge l'objet IPersistFile en EBX
mov ecx,[ebx] ;charge la VMT de l'objet IPersistFile en ECX
push 0 ;sauvegarde le fichier
push dword ptr [ebp-0ch]
push dword ptr [ebp-08h]
call dword ptr [ecx+18h]
createlink_free:
push dword ptr [ebp-0ch] ;libère la mémoire allouée à la chaîne Unicode
call LocalFree
createlink_release_ipersistfile:
mov ecx,[ebx] ;charge la VMT de l'objet IPersistFile en ECX
push ebx ;libère la mémoire allouée à l'objet IPersistFile
call dword ptr [ecx+08h]
createlink_release_ishelllink:
mov ebx,dword ptr [ebp-04h] ;charge l'objet IShellLink en EBX
mov ecx,dword ptr [ebx] ;charge la VMT de l'objet IShellLink en ECX
push ebx ;libère la mémoire allouée à l'objet IShellLink
call dword ptr [ecx+08h]
createlink_end:
pop ebx ;restaure EBX
mov esp,ebp ;enlève les variables locales
pop ebp ;restaure EBP
pop edx ;enlève les arguments passés à la fonction de la pile
pop ecx
add esp,edx
push ecx
ret
text ends
end
Conclusion :
bug éventuel du a l'utilisation des icones (ce n'est aps de moi mais des fois windows va refuser de prendre en compte une icone alors que la fonction reussi sans erreur)
je rappelle juste qu'en raison de la nature de la fonction, le programme doit faire un appel a CoInitialize et CoUninitialize avant et apres la fonction
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.