[com] création de raccourcis [masm32]

Description

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

Codes Sources

A voir également

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.